1.模板简介
模板是 C++ 中的泛型编程的基础。 作为强类型语言,C++ 要求所有变量都具有特定类型,由程序员显式声明或编译器推断。 但是,无论它们运行哪种类型,许多数据结构和算法看起来都相同。 使用模板可以定义类或函数的操作,并让用户指定这些操作应处理的具体类型。
2. 函数模板
模板是基于用户为模板参数提供的参数在编译时生成普通类型或函数的构造。 例如,可以定义如下所示的函数模板:
template<typename T>
void func(T a,T b)
{
cout <<"a+b="<<a+b<<endl;
}
上面的代码描述了具有单个类型参数 T 的泛型函数的模板,其返回值和调用参数 (a 和 b) 都是此类型。 可以命名任何喜欢的类型参数,但按约定使用单个大写字母最常使用。 T 是模板参数;关键字 typename 表示此参数是类型的占位符。 调用函数时,编译器会将每个实例 T 替换为由用户指定或编译器推断的具体类型参数。 编译器从模板生成类或函数的过程称为 模板实例化; func 是模板 func的实例化。
在其他地方,用户可以声明专用于 int 的模板实例:
template<typename T>
void func(T a,T b)
{
cout <<"a+b="<<a+b<<endl;
}
int a=1;
int b= 2;
func<int>(a, b);
但是,由于这是一个函数模板,编译器可以从参数 a 和 b 中推断出类型T,因此可以像普通函数一样调用它:
func(a, b);
当编译器遇到最后一个语句时,它会生成一个新函数,在该 函数中, 模板中每个匹配项都替换为 int.
如果a和b类型不同的话就需要指定类型了,否则编译器不知道怎么确定是int类型还是float类型,如:
int a=1;
float b= 2.0;
func<int>(a, b);
在函数调用参数中使用类型参数 T 之前,不会以任何方式限定类型参数 T,当然typename也可以替换成class二者区别不大,任何内置类型或用户定义的类型都可以用作T类型参数
3.类模板
格式:
template<class T>
class Mcls
{
....
};
Mcls为类名,在类定义体中,如果采用通用数据类型的成员,函数参数的前面需加上T,其中通用类型T可以作为普通成员变量的类型。还可以作为成员函数的参数和返回类型等
如果在类外定义函数,格式如下:
template<class T>
class Mcls
{
void func(void);
....
};
template <class T>
void Mcls<T>:: func(void)
{
...
}
下面是自己写的一个例子:
#include "iostream"
#include "stdlib.h"
using namespace std;
#include "string"
template<class T>
void func(T a,T b)
{
cout <<"a+b="<<a+b<<endl;
}
template<typename T1,typename T2>
class Person
{
public:
Person(T1 a,T2 b);
~Person();
void get_info()
{
cout << this->name << " " << this->age << endl;
}
private:
T1 name;
T2 age;
};
template<typename T1,typename T2>
Person<T1,T2>::Person(T1 a,T2 b)
{
this->name = a;
this->age = b;
}
template<typename T1,typename T2>
Person<T1,T2>::~Person()
{
cout <<"~Person is excuate\r\n"<< endl;
}
template<typename T1,typename T2>
void test1(Person<T1,T2> &a1)
{
int a= 1;
float b = 2.3;
//string name = "like";
//Person<string,int> a1(name,27);
a1.get_info();
cout << "hello world\r\b"<<endl;
func<float>(a,b);
cin.get();
}
int main(void)
{
int a= 1;
float b = 2.3;
string name = "like";
Person<string,int> a1(name,27);
test1(a1);
return 0;
}
其中当类模板作为函数参数形式:
template<typename T1,typename T2>
void func(Person<T1,T2> &a1)
{
...
}
https://docs.microsoft.com/zh-cn/cpp/cpp/templates-cpp?view=msvc-170