目录
C++模板的实例化与具体化:因为实用!
何为模板?
模板说白了就是实现支持处理一类功能的函数,例如:我们想要比较两个数的大小,我们不知道输入输出的类型具体是什么,我不想太具体这个函数,因为太具体的函数用处太狭窄不广泛,我的想法就是把这个函数设计成一个根据我们要求去比较出两个数中最大的值,想输出输入什么类型自我定义。拒绝单调转一,接收泛化实用。
C++模板实例化
什么是C++模板的实例化?
模板类是创建类的蓝图,因此在编译器看来,仅当模板类以某种方式被使用后,其代码才存在。换言之,对于您定义了但未使用的模板类,编译器将忽略它。然而,当您像下面这样通过提供模板参数来实例化模板类(如HoldsPair)时:
HoldsPair<int, double> pairIntDbl;
就相当于命令编译器使用模板来创建一个类,即使用模板参数指定的类型(这里是int和double)实例化模板。因此,对模板来说,实例化指的是使用一个或多个模板参数来创建特定的类型。
C++模板实例化代码示例
① 模板类
#include <iostream>
#include <string>
using namespace std;
template <typename Type1=string,typename Type2> // 这里的typename是定义模板类型的关键字 ,而且可以有默认参数
class Cstudent
{
private:
Type1 name;
Type2 mark;
public:
Cstudent(Type1 name, Type2 mark)
{
this->name = name;
this->mark = mark;
}
~Cstudent()
{
cout << "调用析构函数" << endl;
}
void ShowInf()
{
cout << this->name << "的成绩为" << this->mark << endl;
}
};
int main()
{
Cstudent<string, float> stud("超级霸霸强", 99.99);
// 一定要记住<>其中一定要填写数据类型,模板类不同于模板函数,模板类的初始化方式是通过构造函数,你不给他指定类型构造函数没办法工作
stud.ShowInf();
}
② 模板函数
返回值类型与形参类型不同:
#include <iostream>
#include <string>
using namespace std;
template <typename Type1, typename Type2, typename Type3>
Type3& Max(Type1 var1, Type2 var2) // 形参类型决定了Type1,Type2
{
return var1 > var2 ? var1 : var2;
}
// 如果返回值与形参的类型均不同,那我们必须通过<>来制定
int main()
{
float var1 = 9.95;
double var2 = 8.45942;
cout << Max<float, double, int>(var1, var2) << endl; // <>内部指定数据类型
}
返回值类型与形参相同
#include <iostream>
#include <string>
using namespace std;
template <typename Type1, typename Type2>
Type2& Max(Type1 var1, Type2 var2) // 形参类型决定了Type1,Type2
{
return var1 > var2 ? var1 : var2;
}
int main()
{
float var1 = 9.95;
double var2 = 8.45942;
cout << Max(var1, var2) << endl; // 由于返回值数据类型与形参相同且形参类型取决于输出参数的类型,因此返回值数据类型可以自动判断
}
C++模板具体化
什么是C++模板的具体化?
具体化表示为某一特定的类型重写函数模板,声明的含义是使用独立的,专门的函数定义显示地为特定类型生成函数定义。在有些情况下,使用特定的类型实例化模板时,需要显式地指定不同的行为。这就是具体化模板,即为特定的类型指定行为。
C++模板的具体化代码示例
① 模板函数的具体化
#include <iostream>
#include <string>
using namespace std;
template<typename Type1, typename Type2>
int add(Type1 num1, Type2 num2)
{
return num1 + num2;
}
template<typename Type1 = int, typename Type2 = int> // 千万别和默认参数弄混了,出现类型匹配时,就执行该函数体
void add(Type1 num1, Type1 num2)
{
cout << num1 + num2 << endl;
}
int main()
{
int num1 = 3, num2 = 4;
add(num1, num2);
}
② 模板类的具体化是没有的,为什么呢?
因为模板类是一个类型和处理函数的集合体,它可以由各部分模板组合而成,这样的话可以使得组合而成的模板类使用更加灵活。
#include <iostream>
#include <string>
using namespace std;
template <typename Type1, typename Type2> // 数据类型可以自定义
class Cstudent // 模板类并没有具体化的形式
{
private:
Type1 name;
Type2 math;
public:
Cstudent(string name, float math)
{
this->name = name;
this->math = math;
}
~Cstudent()
{
cout << "调用析构函数" << endl;
}
template <typename Type3, typename Type4>
Type4 ShowInf(Type3 weight) // 成员函数输入输出参数的形式也可以自定义
{
cout << this->name << "的调整后成绩为" << endl; // 数学成绩乘以权重再四舍五入
return weight * (this->math);
}
};
int main()
{
int final;
Cstudent<string, float> stud("超级霸霸强", 99.99);
final = stud.ShowInf<float, int>(0.3);
cout << final << endl;
}
C++模板的实例化与具体化到底有什么用?
常规模板,具体化模板,非模板函数的优先调用顺序:
非模板函数(普通函数)> 具体化模板函数 > 常规模板