一、为什么要特化模板
模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。
二、全特化与偏特化
模板分为类模板与函数模板,特化分为全特化与偏特化。
全特化就是限定死模板实现的具体类型。
偏特化就是如果这个模板有多个类型,那么只限定其中的一部分。
例子:
全特化
template<>
class A<int, double>() {...};
偏特化
template<T>
class B<int, T>() {...};
三、注意事项
1.cpp只能偏特化类模板,不能适用于函数模板
但函数允许重载,声明另一个函数模板即可替代偏特化的需要
2.重载函数需要注意,在std中重载函数是不允许的
比如重载swap函数
namespace std {
template<typename T>
// 注意 swap 后面没有尖括号,这是一个新的模板函数
// 由于当前命名空间已经有同名函数了,所以算函数重载
void swap(Widget<T>& a, Widget<T>& b){
a.swap(b);
}
}
正确做法是别在std命名空间添加(不要试图在std添加任何东西),在一个新的命名空间做这件事