模板的特化(具体化)

2023-11-06

模板的特化(具体化)

重点注意

1)类模板和函数模板都可以被全特化;

2)类模板能偏特化,不能被重载;

3)函数模板可以实现重载,不能被偏特化;

4)类模板调用优先级:全特化类>偏特化类>主版本模板类;

6)函数模板同时存在具体化模板、函数模板重载、和常规函数重载时候,调用优先级:

常规函数 > 具体化模板函数 > 常规模板函数;《这不是比较顺序,而是优先级》

注意:重载决议时,优先决议出是不是符合常规函数,不存在符合的普通函数,才会再决议出符合的函数主模板,对于函数模板重载决议,会无视特化存在(标准规定:重载决议无视模板特化,重载决议发生在主模板之间),决议出函数主模板后,如果函数主模板存在符合的具体化函数模板,才会调用具体化函数模板;

7)不能将函数模板特化和重载混为一谈
函数特化都没有引入一个全新的模板或者模板实例,它们只是对原来的主(或者非特化)模板中已经隐式声明的实例提供另一种定义。在概念上,这是一个相对比较重要的现象,也是特化区别于重载模板的关键之处。

如果使用普通重载函数,那么不管是否发生实际的函数调用,都会在目标文件中生成该函数的二进制代码。而如果使用函数模板特化版本,除非发生函数调用,否则不会在目标文件中包含特化模板函数的二进制代码。这符合函数模板的“惰性实例化”准则。

8>特化可以改变函数体

函数模板

1)常规函数

// 常规函数
void Compare(const char* first, const char* second)
{
	cout << "const char* ordinary function " << endl;
	if (strcmp(first, second) > 0) // 比较char*,需要区别函数主模板进行处理
	{
		cout << "first:" << first << " > second:" << second << endl;
	}
	else
	{
		cout << "first:" << first << " <= second:" << second << endl;
	}
}

2)函数主模板a

//函数主模板
template<typename T, typename N> void Compare(T first, N second)
{
	cout << "Standard function template <T, N>" << endl;
	if (first < second)
	{
		cout << "first < second" << endl;
	}
	else
	{
		cout << "first >= second" << endl;
	}
}

3)函数模本b–全特化

//针对char*类型的比较函数,不能直接使用大于号或小于号比较元素,需要特化;
//函数模板-全特化
template<> void Compare(const char* first, const char* second)
{
	cout << "const char* specialization <const char*, const char*>" << endl;
	if (strcmp(first, second) > 0) // 比较char*,需要区别函数主模板进行处理
	{
		cout << "first:" << first << " > second:" << second << endl;
	}
	else
	{
		cout << "first:" << first << " <= second:" << second << endl;
	}
}

4)函数模板c-重载,作为一个独立的函数主模板

//函数模板-重载,不是偏特化,它会作为一个独立的函数主模板
template<typename T, typename N> void Compare(T* first, N* second)
{
	cout << "function template overload <T*, N*>" << endl;
	cout << "T type: " << typeid(T).name() << ", N type : " << typeid(N).name() << endl;
	if (strcmp(typeid(T).name(), "char") == 0 && strcmp(typeid(N).name(), "char") == 0)
	{
		if (strcmp(first, second) > 0) // 比较char*,需要区别函数主模板进行处理
		{
			cout << "first:" << first << " > second:" << second << endl;
		}
		else
		{
			cout << "first:" << first << " <= second:" << second << endl;
		}
	}
	else
	{
		if (*first < *second)
		{
			cout << "first < second" << endl;
		}
		else
		{
			cout << "first >= second" << endl;
		}
	}
}

5)函数模板之间的重载决议

1】当代码中存在如下顺序的申明时,

template<typename T, typename N> void Compare(T first, N second) //函数主模板a

{.....}

template<> void Compare(const char* first, const char* second) // 函数主模板a的全特化模板 b

{.....}

template<typename T, typename N> void Compare(T* first, N* second) // 函数主模板c,是函数主模板a的重载

{.....}

那么,发生如下函数调用时,

Compare("1", "2");
函数将调用函数主模板c
    

因为在调用Compare("1", "2")时,先会进行重载决议,
发生重载决议,会无视特化存在(标准规定:重载决议无视模板特化,重载决议发生在主模板之间),
那么就会决议出函数主模板c;
那将会调用函数主模板c
    
    《根据第六条,:重载决议时,优先决议出是不是符合常规函数,不存在符合的普通函数,才会再决议出符合的函数主模板,对于函数模板重载决议,会无视特化存在(标准规定:重载决议无视模板特化,重载决议发生在主模板之间),决议出函数主模板后,如果函数主模板存在符合的具体化函数模板,才会调用具体化函数模板;》
    

6)常规函数与函数模板之间的重载决议

当代码中存在如下顺序的申明时,

template<typename T, typename N> void Compare(T first, N second) //函数主模板a

{.....}

template<> void Compare(const char* first, const char* second) // 函数主模板a的全特化模板 b

{.....}

template<typename T, typename N> void Compare(T* first, N* second) // 函数主模板c,是函数主模板a的重载

{.....}
void Compare(const char* first, const char* second) // 常规函数

{.....}

那么,发生如下函数调用时,

Compare("1", "2");

函数将调用常规函数
    
因为在调用Compare("1", "2")时,先会进行重载决议,重载决议会优先决议是否存在符合条件的常规函数。
    

7)函数模板全部实现


#include<iostream>
using namespace std;
#include<string.h>
#include<vector>

/******************************* template function start ****************************************/
 
//函数主模板
template<typename T, typename N> void Compare(T first, N second)
{
	cout << "Standard function template <T, N>" << endl;
	if (first < second)
	{
		cout << "first < second" << endl;
	}
	else
	{
		cout << "first >= second" << endl;
	}
	cout << endl;
}
 
//函数模板-全特化
template<> void Compare(const char* first, const char* second)
{
	cout << "const char* specialization <const char*, const char*>" << endl;
	if (strcmp(first, second) > 0) // 比较char*,需要区别函数主模板进行处理
	{
		cout << "first:" << first << " > second:" << second << endl;
	}
	else
	{
		cout << "first:" << first << " <= second:" << second << endl;
	}
	cout << endl;
}
 
//函数主模板-重载,不是偏特化,它会作为一个独立的函数主模板
template<typename N> void Compare(int first, N second)
{
	cout << "partitial specialization <int, N>" << endl;
	if (first < second)
	{
		cout << "first < second" << endl;
	}
	else
	{
		cout << "first >= second" << endl;
	}
	cout << endl;
}
 
//函数模板-重载,不是偏特化,它会作为一个独立的函数主模板
template<typename T, typename N> void Compare(T* first, N* second)
{
	cout << "function template overload <T*, N*>" << endl;
	cout << "T type: " << typeid(T).name() << ", N type : " << typeid(N).name() << endl;
	if (strcmp(typeid(T).name(), "char") == 0 && strcmp(typeid(N).name(), "char") == 0)
	{
		if (strcmp(first, second) > 0) // 比较char*,需要区别函数主模板进行处理
		{
			cout << "first:" << first << " > second:" << second << endl;
		}
		else
		{
			cout << "first:" << first << " <= second:" << second << endl;
		}
	}
	else
	{
		if (*first < *second)
		{
			cout << "first < second" << endl;
		}
		else
		{
			cout << "first >= second" << endl;
		}
	}
	cout << endl;
}
 
//函数主模板-重载,不是偏特化,它会作为一个独立的函数主模板
template<typename T, typename N> void Compare(std::vector<T>& first, std::vector<N>& second)
{
	cout << "to vector partitial specialization <std::vector,std::vector>" << endl;
	if (first.size() < second.size())
	{
		cout << "first.size() < second.size()" << endl;
	}
	else
	{
		cout << "first.size() >= second.size()" << endl;
	}
	cout << endl;
}
 
// 常规函数
void Compare(const char* first, const char* second)
{
	cout << "const char* ordinary function " << endl;
	if (strcmp(first, second) > 0) // 比较char*,需要区别函数主模板进行处理
	{
		cout << "first:" << first << " > second:" << second << endl;
	}
	else
	{
		cout << "first:" << first << " <= second:" << second << endl;
	}
	cout << endl;
}
 
// 测试函数模板功能
void Test_Temmplate_Function()
{
	cout << __FUNCTION__ << ":" << endl;
	Compare(1,2);
	Compare(1, 2.0);
	Compare(1.0, 2.0);
	Compare('1', '2');
	Compare("1", "2");
	vector<int> v1 = { 1 };
	vector<int> v2 = { 2 };
	Compare(v1, v2);
	cout << endl;
}
 
/******************************* template function end ****************************************/

int main()
{
    Test_Temmplate_Function();
}

//输出结果

Test_Temmplate_Function:
partitial specialization <int, N>
first < second

partitial specialization <int, N>
first < second

Standard function template <T, N>
first < second

Standard function template <T, N>
first < second

const char* ordinary function 
first:1 <= second:2

to vector partitial specialization <std::vector,std::vector>
first.size() >= second.size()

5.类模板

必须先有泛化版本类模板(主模板),才有特化版本类模板。

1)类模板特化分类

特化为绝对类型(全特化);

特化为引用,指针类型(半特化、偏特化);

特化为另外一个类模板(复杂点的偏特化)

2)类模板-主模板类

//类模板-主版本模板类
template<typename T, typename N> class MyClass
{
public:
	 void Compare(T first, N second)
	{
		cout << "standard function template" << endl;
		cout << __FUNCTION__ << ":" << endl;
		if (first < second)
		{
			cout << "first < second" << endl;
		}
		else
		{
			cout << "first >= second" << endl;
		}
	}
};

3)类模板-全特化(具体化)

//类模板-全特化(具体化)
template<> class MyClass<const char*, const char*>
{
public:
	 void Compare(const char* first, const char* second)
	{
		cout << "const char* specialization" << endl;
		cout << __FUNCTION__ << ":" << endl;
		if (strcmp(first, second) > 0) // 比较char*,需要区别函数主模板进行处理
		{
			cout << "first:" << first << " > second:" << second << endl;
		}
		else
		{
			cout << "first:" << first << " <= second:" << second << endl;
		}
	}
};

4)类模板-特化(部分具体化),对部分模板参数进行特化为一般类型

//类模板-特化(部分具体化),对部分模板参数进行特化
template<typename N> class MyClass<int, N>
{
public:
	void Compare(int first, N second)
	{
		cout << "partitial specialization" << endl;
		cout << __FUNCTION__ << ":" << endl;
		if (first < second)
		{
			cout << "first < second" << endl;
		}
		else
		{
			cout << "first >= second" << endl;
		}
	}
};

5)类模板-特化(部分具体化),将模板参数特化为指针

//类模板-特化(部分具体化),将模板参数特化为指针
template<typename T, typename N> class MyClass<T*, N*>
{
public:
	 void Compare(T* first, N* second)
	{
		cout << "ptr partitial specialization" << endl;
		cout << __FUNCTION__ << ":" << endl;
		if (first < second)
		{
			cout << "first < second" << endl;
		}
		else
		{
			cout << "first >= second" << endl;
		}
	}
};

6)类模板-特化(部分具体化),将模板参数特化为另一个模板类

//类模板-特化(部分具体化),将模板参数特化为另一个模板类
template<typename T, typename N> class MyClass<vector<T>, vector<N>>
{
public:
	void Compare(const vector<T>& first, const vector<N>& second)
	{
		cout << "to vector partitial specialization" << endl;
		cout << __FUNCTION__ << ":" << endl;
		if (first.size() < second.size())
		{
			cout << "first.size < second.size" << endl;
		}
		else
		{
			cout << "first.size >= second.size" << endl;
		}
	}
};

7)类模板特化全部实现

 
/******************************* template class start ****************************************/
 
//类模板-主版本模板类
template<typename T, typename N> class MyClass
{
public:
	 void Compare(T first, N second)
	{
		cout << "standard function template" << endl;
		cout << __FUNCTION__ << ":" << endl;
		if (first < second)
		{
			cout << "first < second" << endl;
		}
		else
		{
			cout << "first >= second" << endl;
		}
	}
};
 
//类模板-全特化(具体化)
template<> class MyClass<const char*, const char*>
{
public:
	 void Compare(const char* first, const char* second)
	{
		cout << "const char* specialization" << endl;
		cout << __FUNCTION__ << ":" << endl;
		if (strcmp(first, second) > 0) // 比较char*,需要区别函数主模板进行处理
		{
			cout << "first:" << first << " > second:" << second << endl;
		}
		else
		{
			cout << "first:" << first << " <= second:" << second << endl;
		}
	}
};
 
//类模板-特化(部分具体化),对部分模板参数进行特化
template<typename N> class MyClass<int, N>
{
public:
	void Compare(int first, N second)
	{
		cout << "partitial specialization" << endl;
		cout << __FUNCTION__ << ":" << endl;
		if (first < second)
		{
			cout << "first < second" << endl;
		}
		else
		{
			cout << "first >= second" << endl;
		}
	}
};
 
//类模板-特化(部分具体化),将模板参数特化为指针
template<typename T, typename N> class MyClass<T*, N*>
{
public:
	 void Compare(T* first, N* second)
	{
		cout << "ptr partitial specialization" << endl;
		cout << __FUNCTION__ << ":" << endl;
		if (first < second)
		{
			cout << "first < second" << endl;
		}
		else
		{
			cout << "first >= second" << endl;
		}
	}
};
 
//类模板-特化(部分具体化),将模板参数特化为另一个模板类
template<typename T, typename N> class MyClass<vector<T>, vector<N>>
{
public:
	void Compare(const vector<T>& first, const vector<N>& second)
	{
		cout << "to vector partitial specialization" << endl;
		cout << __FUNCTION__ << ":" << endl;
		if (first.size() < second.size())
		{
			cout << "first.size < second.size" << endl;
		}
		else
		{
			cout << "first.size >= second.size" << endl;
		}
	}
};
 
// 测试类模板功能
void Test_Temmplate_Class()
{
	cout << __FUNCTION__ << ":" << endl;
 
	MyClass<char, int> c_i_myclass;
	c_i_myclass.Compare(1, 2);
	printf("function address: %p\n\n", &MyClass<char,int>::Compare);
 
	MyClass<int, double> i_d_myclass;
	i_d_myclass.Compare(1, 2);
	printf("function address: %p\n\n", &MyClass<int, double>::Compare);
 
	MyClass<int, int> i_i_myclass1;
	i_i_myclass1.Compare(1, 2);
	printf("function address: %p\n\n", &MyClass<int, int>::Compare);
 
	MyClass<int, int> i_i_myclass2;
	i_i_myclass2.Compare(1, 2);
	printf("function address: %p\n\n", &MyClass<int, int>::Compare);
 
	MyClass<const char*, const char*> c_c_c_c_myclass;
	c_c_c_c_myclass.Compare("1", "2");
	printf("function address: %p\n\n", &MyClass<const char*, const char*>::Compare);
 
	MyClass<vector<int>, vector<char>> vc_i_vc_c_maclass;
	vc_i_vc_c_maclass.Compare({ 1 }, { 1,2 });
	printf("function address: %p\n\n", &MyClass<vector<int>, vector<char>>::Compare);
 
	cout << endl;
}
 
/******************************* template class end ****************************************/

运行结果

Test_Temmplate_Class:
standard function template
Compare:
first < second
function address: 0x5581ffb2399c

partitial specialization
Compare:
first < second
function address: 0x5581ffb23a84

partitial specialization
Compare:
first < second
function address: 0x5581ffb23b76

partitial specialization
Compare:
first < second
function address: 0x5581ffb23b76

const char* specialization
Compare:
first:1 <= second:2
function address: 0x5581ffb23834

to vector partitial specialization
Compare:
first.size < second.size
function address: 0x5581ffb23e8e

此外,特化的模板只在传入特定的参数时才会调用,否则调用主模板


//模板操作自定义类型:方法一采用重载函数,将<<重载为友元函数,能访问保护成员。也能打印对象
#include <iostream>
#include<string.h>
using namespace std;
template<class T>
void print(T object)
{
    cout<<object<<endl;
    cout<<" choose_this "<<endl;
}
class point
{

    friend  void print<point>(point object);
protected:
    int x;
    int y;
    string name;
//改正方法

public:
    point(int x, int y,string name):x(x),y(y),name(name){};

};
template<>
void print<point>(point object)
{
    cout<<object.x<<" "<<object.y<<" "<<object.name<<endl;
    cout<<" choose_that "<<endl;

}
int main()
{  print(255);
   cout<<"*****************************"<<endl;
    point pp(11,22,"x and y");
    //隐式调用
    print (pp);
}


调用结果

255
 choose_this 
*****************************
11 22 x and y
 choose_that 

特化的模板只有特定的参数才能被调用,否则不会

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模板的特化(具体化) 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 数据结构—单链表C语言刷题2

    目录 1 链表分割 2 链表的回文结构 3 相交链表 4 环形链表 5 环形链表II 1 链表分割 题目链接 链表分割 题目描述 现有一链表的头指针 ListNode pHead 给一定值x 编写一段代码将所有小于x的结点排在其余结点之前
  • Debug下出现debug assertion failed

    出现debug assertion failed界面后点击重试跳到这句ASSERT m hObject NULL 采用注释查找错误的方式定位至 if CFrameWnd OnCreate lpCreateStruct 1 return 1
  • 获取referer中的请求参数_Http请求头中的referer

    Referer是 HTTP请求header 的一部分 当浏览器 或者模拟浏览器行为 向web 服务器发送请求的时候 头信息里有包含 Referer 比如我在www google com 里有一个www baidu com 链接 那么点击这个
  • 在Linux内核中添加自己的驱动程序

    就说一下怎么添加进去吧 首先你要把驱动程序写好 我已添加 首先在drivers目录下面创建GPIO文件夹 文件夹下面创建三个文件 分别是 gpio c Kconfig Makefile 三个文件 gpio c是你的驱动程序 Kconfig是
  • Spring复习笔记

    1 Spring 1 1 简介 优点 Spring是一个轻量级控制反转 IoC 和面向切面 AOP 的容器 轻量级 低侵入 松耦合 框架粘合剂 更容易整合其他框架 支持事务处理 官网 https spring io projects spr
  • 不怕死就上这些网站

    1 hxxp www dj3344 com 打开后 重启时你的主页就变成它的 并通过QQ向他人传播 现在正飙行 奇坏无比 2 hxxp www qq168 net 打开后 重启时你的主页就变成它的 并通过QQ向他人传播 而且传波病毒 还狠些
  • 我的GIT练习Four

    目录 前言 GIT安装教程 Git作者 GIT优点 GIT缺点 为什么要使用 Git GIT练习Four C1 初始化项目 C2 设计项目首页 C3 设计登录页面 C4 实现登录功能 C5 设计后台页面 C6 设计注册页面 C7 实现注册功
  • 拼搏百天!上月喜获阿里内推,交叉面把面试官面傻眼了

    阿里内推一面 项目 1 面试官让我描述一个自己印象最深的项目 手画设计图 2 针对项目中的技术进行发问 比如 架构设计 部署图 模块之间的通信等 3 因为我描述项目存储数据比较多 让我重新设计数据库的表 怎么设计 后面都是针对项目技术的问题
  • iOS 蓝牙扫描枪扫描内容不正确

    背景 在移动设备上 使用蓝牙扫描枪 相当于接入了一下外接键盘 我们的客户使用我们的App 并连接蓝牙扫码枪 将扫描的内容传输到我们的App中 App再做出对应的响应 举个例子 较为常见的应用场景就是 拣货员拿着扫码枪 扫描产品上的UPC码
  • HttpClient的ssl方式发送请求

    最近因为项目需要 需要以rest方式和第三方平台交互 由于需要ssl方式连接 所以记录一下 maven依赖如下
  • openssl做HMAC实例(C++)

    1 HMAC简介 1 MAC Message Authentication Code 消息认证码算法 可以将其认为是含有秘钥的散列 Hash 函数算法 即兼容了MD和SHA算法 并在此基础上加上了秘钥 因此MAC算法也经常被称作HMAC算法
  • 常见的WRF运行错误

    转载至 https wk atmchem github io 2021 06 03 WRFbugandSolutions WPS Errors Ungrib exe Segmentation Fault Parsed 29 entries
  • sql server判断两个字符串是否相等(区分大小写)

    步骤 一 新增测试数据 新建测试表 create table testTable1 str1 varchar 100 str2 varchar 100 新增测试数据 如下图 二 两字符串进行比较 当直接使用 号进行判断时 是无法区分大小写的
  • 深度学习速学上手小项目

    demo仓库和视频演示 银色子弹zg的个人空间 银色子弹zg个人主页 哔哩哔哩视频 卷积网路CNN分类的模型一般使用包括alexnet DenseNet DLA GoogleNet Mobilenet ResNet ResNeXt Shuf
  • AIX下使用ASM

    metalink note 282036 1 IBM Software Requirements and PTFs for AIX 5 3 support of Oracle Database 10g Release 2 10 2 0 1
  • Anaconda 的Jupyter Notebook更换默认浏览器

    因为之前装的Anaconda默认使用的是系统自带的Edge浏览器 对的 就是这个玩意 然后自己近期一直用的win11 前几个版本还没什么太大问题 但是在20号左右系统自动更新了一下 对的就是这个 然后Microsoft Edge浏览器直接打
  • LUA中的and与or

    LUA中的and与or 2013 01 04 14 51 14074人阅读 评论 2 收藏 举报 分类 Lua 44 逻辑运算符认为false和nil是假 false 其他为真 0也是true and的优先级比or高 其它语言中的and表示
  • 小程序的数据驱动和Vue的双向绑定有何异同

    引言 在现代应用程序开发中 数据驱动和双向绑定是两个非常重要的概念 它们能够提供更好的用户体验和开发效率 本文将探讨小程序的数据驱动和Vue的双向绑定 并通过代码实例来说明它们的异同 让我们一起来了解吧 小程序的数据驱动 小程序是一种轻量级
  • Java初阶——练习题

    import java util Random import java util Scanner public class java 11 1 public static void main String args int ret numb
  • 模板的特化(具体化)

    模板的特化 具体化 重点注意 1 类模板和函数模板都可以被全特化 2 类模板能偏特化 不能被重载 3 函数模板可以实现重载 不能被偏特化 4 类模板调用优先级 全特化类 gt 偏特化类 gt 主版本模板类 6 函数模板同时存在具体化模板 函