概述
自己关于C++实例化和具体化的简单理解
首先是隐式实例化:
template<typename T>
void swap(T& a, T& b);//隐式实例化,只有当后面使用到时编译器才进行实例化函数
刚开始创建函数模板时,就是这种情况,当后续未调用该函数时,是不会实例化该函数的。
然后是显式实例化:
template void swap<int>(int& a, int& b);
/*显式实例化,无论后面是否使用了该函数,编译器都会生成一个实例函数,
和模板函数具有相同的功能,显示实例化的函数不能更改函数内容*/
此时确定了模板参数的类型,无论后续是否会调用swap()函数,该实例都已经存在了,该实例的功能和模板函数的功能一致。
最后是显式具体化:
template<> void swap(double& a, double& b);
template<> void swap(job& a, job& b);
/*显式具体化,遇到相应的特征标直接调用,有一点重载的意思,
可以重新变更函数内容*/
此时无论是否调用swap()函数,显示具体化都会创建相应的实例,且该实例的功能可以与函数模板不一致…
具体的小代码:
#include <iostream>
#include <string>
/*
模板的隐式实例化,显式实例化,显式具体化
*/
struct job
{
char name[64];
int salary;
std::string pos;
};
template<typename T>
void swap(T& a, T& b);//隐式实例化,只有当后面使用到时编译器才进行实例化函数
//void swap(int& a, int& b);//非模板函数,调用时优先级最高
template void swap<int>(int& a, int& b);
/*显式实例化,无论后面是否使用了该函数,编译器都会生成一个实例函数,
和模板函数具有相同的功能,显示实例化的函数不能更改函数内容*/
template<> void swap(double& a, double& b);
template<> void swap(job& a, job& b);
/*显式具体化,遇到相应的特征标直接调用,有一点重载的意思,
可以重新变更函数内容*/
int main()
{
using std::cout;
using std::endl;
int a = 57, b = 75;
double c = 105.0,d=501;
cout << "a=" << a << " " << "b=" << b << R"(swap 'a' and 'b')" << endl;
swap(a, b);
cout << "result: " << "a=" << a << " " << "b=" << b << endl;
swap(c, d);//template<> void swap(double& a, double& b),显式实例化变更函数的功能
cout << "double instance: " << c << endl;//c=606
job a1 = { "gouzi668",10,"Husky" };
job a2 = { "gouzi667",100,"Alaska" };
cout << "at begining:" << "a1 name: " << a1.name << " a1 salary: " << a1.salary << " a1 pos: " << a1.pos << endl;
swap(a1, a2);//template<> void swap(job& a, job& b);
cout << "after swap:" << "a1 name: " << a1.name << " a1 salary: " << a1.salary << " a1 pos: " << a1.pos << endl;
return 0;
}
template <typename T>
void swap(T& a, T& b)//使用时进行隐式实例化
{
T temp=a;
a = b;
b = temp;
}
/*
void swap(int& a, int& b)
{
a = a + b;
}
//非模板函数调用优先级高于模板类函数
*/
template<> void swap(job& a, job& b)//显式具体化,遇到相应的特征标直接调用
{
int temp = a.salary;
a.salary = b.salary;
b.salary = temp;
std::string temp2 = a.pos;
a.pos = b.pos;
b.pos = temp2;
}
template<> void swap(double& a, double& b)
{
a = a + b;
}
运行结果如下
可以看到两个显式具体化的情况实现了函数功能的更改,将非模板函数的注释删除后,可以看到打印的结果是’a+b’,是前面定义的非模板函数的功能,调用优先权是最高的.
Bye.
最后
以上就是暴躁小虾米为你收集整理的C++函数模板的实例化和具体化的全部内容,希望文章能够帮你解决C++函数模板的实例化和具体化所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复