二、类模板特例化
除了特例化函数模板,我们还可以特例化类模板。下面是一个简单的例子:
template <typename T> class Test{ public: void print(){ cout << "General template object" << endl; } }; template<> // 对int型特例化 class Test<int>{ public: void print(){ cout << "Specialized template object" << endl; } }; int main() { Test<int> a; Test<char> b; Test<float> c; a.print(); b.print(); c.print(); return 0; } |
输出结果:
Specialized template object
General template object
General template object
另外,与函数模板不同,类模板的特例化不必为所有模板参数提供实参。我们可以只指定一部分而非所有模板参数,这种叫做类模板的偏特化 或部分特例化(partial specialization)。例如,C++标准库中的类vector的定义:
template <typename T, typename Allocator> class vector { /*......*/ }; // 部分特例化 template <typename Allocator> class vector<bool, Allocator> { /*......*/ }; |
在vector这个例子中,一个参数被绑定到bool类型,而另一个参数仍未绑定需要由用户指定。注意,一个类模板的部分特例化版本仍然是一个模板,因为使用它时用户还必须为那些在特例化版本中未指定的模板参数提供实参。