类模板可以定义任意多个不同类型的参数
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工程中使用模板特化代替类(函数)重定义