C++函数模板的实例化和具体化

自己关于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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值