【C++】59.类模板的深度解剖

mac2026-03-27  6

类模板可以定义任意多个不同类型的参数

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工程中使用模板特化代替类(函数)重定义

 

 

 

 

 

 

 

 

最新回复(0)