函数模板例如编写一个比较大小的函数时如果参数不确定则需要编写一组重载函数以满足不同类型的需求但是带来的后果是如果后期需要修改函数逻辑意味着所有的重载函数都要修改。如果使用函数模板则只需要编写一次即可template typename T int compare(const T a, const T b){ if(ab) return -1; if(ba) return 1; return 0; }然后如果对函数进行调用编译器会根据参数类型进行判断然后实例化一个指定参数类型的模板函数。double a1.2, b2.0; int ccompare(a , b); //自动推断类型为doubleab必须同一类型 必须传入支持 操作符的类型 int d comparedouble(a, b);// 显式指定为double,编译器不再自动推断函数模板的限制必须传入相同类型的参数如果不同可以通过重载函数实现只支持全特化不支持偏特化。可以通过重载函数实现我们可以通过模板特化实现两个char类型参数比较template int compare(char a, char b){ if(a-b0) return 1; if(b-a0) return -1; return 0; }或者通过函数重载实现int compare(char a, char b){ //普通函数 if(a-b0) return 1; if(b-a0) return -1; return 0; }函数匹配规则如果即做了模板特化又做了函数重载那到底调用哪个呢函数的匹配规则如下寻找参数完全匹配的普通函数寻找模板参数完全匹配的函数模板寻找可以通过隐式转换匹配的普通函数如果都没找到爆编译失败类模板与函数模板类似类模板中的数据成员和函数成员都可以使用模板参数中的待定类型。区别是使用类模板创建对象之前必须先实例化一个模板类必须显式的指定模板参数类型template typename T1typename T2 class Animal{ public: Animal(T1 a, T2 b):a(a,b)() int compare(const T1a, const T1 b); private: T1 a; T2 b; }Animalint, int dog(1,100); Animalint, double cat(2,0.1);类模板的全特化与偏特化如果要想实现特殊的类可以通过模板全特化或模板偏特化实现template typename T1 //偏特化 class AnimalT1,char{ } template //全特化 class Animalchar,char{ }