函数模板
通过建立一个通用函数,其类型与形参不具体指定,用虚拟类型表示,这个函数就是函数模板
template<类型形式参数表typename>
类型 函数名<形式参数表>
{
语句块
}在需要类型转换时,需要显示调用
test<int, char>('a',65);
函数模板实现机制:
二次编译/延迟编译:第一次编译时看到函数模板定义,只做语法检错不检查数据类型的错误,第二次当实例化对象时,看到函数模板根据传递参数再检查数据类型错误。
类模板
概念:
类模板中定义的函数参数类型或者属性等数据类型可以参数化。
template<typename T>
class A
{
public:
T a;
}
调用时必须显示调用
A<int> a;
类模板的继承
普通函数继承:
继承的同时对基类实例化Class Child:public Parent<int>
模板类派生模板类:
继承的同时不会对parent实例化。
模板中是static
模板类会根据具体类型生成各种各样的类,每一个类所实例化的对象都共享这个静态变量。
成员模板
作用:
为了实现有别于模板类的虚拟类型。不然在类中只有具体类型和模板类虚拟类型,现在有了成员函数模板虚拟类型。
1.class的成员可以是template
2.但成员模板不能是virtual
3. 被用来支持class template内的成员之间的自动类型转换。
#include <iostream> using namespace std; template <typename T> class Test { public: T m_a; public: template<typename X> void print(const Test<X> &a) { cout << a.m_a << endl; } }; int main(int argc,char *argv[]) { Test<int> a; a.m_a = 1; Test<double> b; b.m_a = 1.123; a.print(a); a.print(b); b.print(b); b.print(a); return 0; }
关键词:typename
内嵌依赖函数类型名
1.内嵌:指在类的内部定义的
2.依赖:依赖于一个模板参数
3.类型名:最终指出一个类型名
实例化
隐式实例化:
在函数调用时,不指定数据类型名,编译器自动推演参数类型,之后对函数模板实例化
显示实例化:
在外部指定数据类型,且在调用前将函数模板实例化。
模板全特化和偏特化
作用:
处理一些模板处理不了或者处理不好的数据而理性,需要将这些类型特例化,按照特例化的方法处理原理:
对于特定的类型,传参时,会优先匹配“模板参数”最符合传参的模板。
偏特化:
1.模板参数数量
2.模板参数类型
3.模板参数范围(const)