【C++函数模板的具体化】在代码中声明函数模板的时候,是不会生成函数定义的,当编译器使用模板为特定类型生成函数定义时,得到的是模板实例。
例如如下代码,这样的模板并非函数定义。
template
void Swap(T &a, T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}
函数模板的具体化又分为隐式实例化、显示实例化、显示具体化。
1、隐式实例化
int main()
{
int a = 10, b = 20;
Swap(a, b);
}
在上述代码中,函数调用Swap(i,j)导致编译器生成Swap实例,这种实例化称为隐式实例化,因为编译器之所以知道需要进行定义,是由于程序调用了Swap函数时提供了int参数,这种实例化的方式存在效率低下的缺点,因为其无法在程序编译时就生成函数定义。
2、显示实例化
显示实例化可以解决隐式实例化的缺点,其可以直接命令编译器创建特定的实例,其语法为如下
template void Swap(int, int);
3、显示具体化
显示具体化主要针对特殊的数据类型,如结构体,其可以对底层的模板进行改动,从而使其针对这种特殊的数据类型执行特定的操作。例如以下代码,我声明了一个结构体,想要只交换结构体中的salary和floor,不交换name,就要使用显示具体化。
struct job
{
char name[40];
double salary;
int floor;
};
template<> void Swap(job&a, job&b)
{
double t1;
int t2;
t1 = a.salary;
a.salary = b.salary;
b.salary = t1;
t2 = a.floor;
a.floor = b.floor;
b.floor = t2;
}
因此调用时,显示具体化将会优先于常规模板。
推荐阅读
- LeetCode刷题|recording:24. 两两交换链表中的节点
- C++|大话STL第九期——仿函数(函数对象)
- LeetCode刷题|recording:59.螺旋矩阵II
- SLAM|<<Slam十四讲>> ch13环境安装
- c++|为什么每一名程序员都应该学习 C++()
- opencv从入门到放弃|opencv C艹(色彩空间转换,像素最值,二值化,LUT)
- C++|在路上
- C++STL|deque容器详解
- c++|基于C++的即时通信软件设计