类模板可以定义任意多个不同类型的参数
template <typename T1, typename T2> class Test { public: void Add(T1 a, T2 b); }; Test<int, float>t //一一指定参数类型。
类模板的特化
根据需要分开实现(可以在特化的地方实现不同的函数),本质还是同一个模板,将一个模板具体分到不同对象的实现
(部分特化,完全特化), 并不是从新定义一个新的模板,只是上面的一个特殊实现。
template <typename T1, typename T2> class Test {}; // 部分特化(用特点规则约束类型参数) template <typename T> // 当 Test 类模板的两个类型参数完全相同的时候,用这个实现 class Test <T, T> {}; // 完全特化(完全显示指定类型参数) template <> class Test<int, int> {};类模板特化注意事项:
问题:
1.类模板特化与重定义有区别嘛?
2.函数模板可以特化嘛?(完全特化和函数重载有什么区别)
当需要重载函数模板时,优先考虑使用模板特化;
当模板特化无法满足需求时,在使用函数重载
(两个都在的时候,编译器默认选择全局的函数重载)
bool Equal<double>(double a, double b) { const double delta = 0.00000000000001; double r = a - b; cout << "bool Equal<double>(double a, double b)" << endl; return (-delta < r) && (r < delta); } bool Equal(double a, double b) // 函数重载版本 { const double delta = 0.00000000000001; double r = a - b; cout << "bool Equal(double a, double b)" << endl; return (-delta < r) && (r < delta); } cout << Equal<>(0.01, 0.01) << endl; // 限定匹配函数模板 cout << Equal(0.01, 0.01) << endl; //优选选择全局函数
1.类模板可以定义任意多个不同类型的参数
2.类模板被部分特化和完全特化
3.特化的本质是模板的分开实现
4.函数模板只支持完全特化
5工程中使用模板特化代替类(函数)重定义
