c++函数模板
函数模板概念:用函数或类,不具体指定其类内部的类型和函数的形参类型,用一个虚拟的类型来代表
#创建交换两个变量的函数模板 template <typename anytype> void Swap(anytype &a,anytype &b) { anytype tmp; tmp = a; a = b; b = tmp; }
#注意事项
可以为类的成员函数创建模板,但是不能给虚函数和析构函数创建模板
使用函数模板时,如果是自动类型推导,不会发生隐式类型转换,如果显式指定了函数模板的数据类型,可以发生隐式类型转换。
多个通用类型参数的函数模板
template <typename T1,typename T2) void show(T1,T2) { cout<<"name is"<<T1<<" age is T2); } int main() { show("bob",20); }
函数模板具体化
提供一个具体参数的函数定义,当编译器找到与之相匹的具体化定义时使用该定义,不在使用函数模板
#具体化语法
#template<> void 函数模板名<数据类型>(参数列表) //和下行效果一样
template<> void 函数模板名(参数列表)
{
//函数体
}
编译器使用各种函数的规则
#优先级
普通函数》具体化》常规模板
如果希望使用函数模板,可以用空模板参数强制使用函数模板。
例:Swap<>(a,b);
如果函数模板能产生更好的匹配,将优先于非模板函数。
函数模板分文件编写
#.h文件中进行函数声明
template <typename T>
1 void Swap(T a, T b); //函数具体化声明
2 void Swap(T a, T b); //普通函数声明
3 template <typename T> //普通函数模板声明和定义要放在一起,不然会报错
void Swap(T a, T b)// 函数模板
{cout <<"使用了函数模板。 \n”}
#注意:具体化参数函数在头文件声明后.c文件中依旧要加template <typename T>
例:template <>
void Swap(T a, T b)// 函数模板
{cout <<"hello。\n”}
类模板概念:
类模板是通用类的描述,使用任意类型(泛型)来描述类的定义。
使用类模板的时候,指定具体的数据类型,让编译器生成该类型的类定义。
语法: template <class T> class 类模板名
{类的定义;}
#类模板示例
template <class T1,class T2>
class AA
{
public:
T1 m_a;// 通用类型用于成员变量
T2 m_b;// 通用类型用于成员变量 AA(){} // 默认构造函数是空的
// 通用类型用于成员函数的参数。
AA(T1 a,T2 b):m_a(a),m_b(b)// 通用类型用于成员函数的返回值
T1 geta()// 获取成员m a的值
{
T1 a = 2;// 通用类型用于成员函数的代码中
return m_a + a
}
T2 getb0) // 获取成员m b的值
{
T2 b = 1;// 通用类型用于成员函数的代码中
return m_b + b
}
}
int main()
{
AA<int, double> a; // 用模板类AA创建对象
a.m_a = 20;
a.m_b = 30;
cout << "a.geta()=" << a.geta() << endl;
cout << "a.getb()=" << a.getb() << endl;
}
类模板注意事项
1)在创建对象的时候,必须指明具体的数据类型。
//例AA<int, double> a; 中括号里不能为空 2)使用类模板时,数据类型必须适应类模板中的代码。 3)类模板可以为通用数据类型指定缺省的数据类型(C+ +11标准的函数模板也可以)。
//例:template <class T1,class T2 = string>指定后main函数里可以写成A<int> a;
4)类的成员函数可以在类外实现。实现语法如下:
template <class T1, class T2>
T2 AA<T1,T2>::getb()
{return m_b;}
5)可以用new创建模板对象。语法如下
AA<int, string>* a = new AA<int, string>(3, "西施"); // 用模板类AA创建对象a。
6)在程序中,模板类的成员函数使用了才会创建。

浙公网安备 33010602011771号