我是靠谱客的博主 暴躁小虾米,最近开发中收集的这篇文章主要介绍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.

最后

以上就是暴躁小虾米为你收集整理的C++函数模板的实例化和具体化的全部内容,希望文章能够帮你解决C++函数模板的实例化和具体化所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部