类模板
类模板最常见的应用就是容器,比如我们常用的std::vector。
假设下面的代码实现一个Stack
class Stack
...{..
};
Usage: Stack<int>
上面的代码很容易理解,这个是类模板最基础的用法,在任何C++的书籍当中都可以学习到,让我们加快脚步。
Specializations of Class Templates
上面这个单词的典型翻译我不懂(实例化,特化,很乱……),建议还是记住这个单词吧。
当我们的模板类在处理特定类型的时候需要不同的操作的时候,我们可以利用specialization,例如对于char*的字符串进行比较的时候用<明显是错误的,可以重写一个char*版本的并调用strcmp来判断。
下面举一个不太实际的例子(因为没有必要为string单独specialization):
class Stack<std::string> ...{
…
};
void Stack<std::string>::push (std::string const& elem)
...{
elems.push_back(elem); // append copy of passed elem
}
这里重点演示specialization的语法。
Partial Specialization
这个特性在Generic Programming中非常常用,还是看例子:
如果用
MyClass<int,int> m;
会有二义性错误,因为compiler不知道是<T,T>还是<T,int>。
当然
MyClass<int*,int*>也是有二义性的。
需要注意的是,在partial specialization的时候,需要参数列表中的参数个数与原始的模板类所指定的参数个数相同。
Partial specialization有什么用呢,下面的代码给人以无限的遐想:
class Widget
...{
... generic implementation ...
};
template <>
class Widget<ModalDialog, MyController>
...{
... specialized implementation ...
};
// Partial specialization of Widget
template <class Window>
class Widget<Window, MyController>
...{
... partially specialized implementation ...
};
Default Template Arguments
class Stack ...{
private:
CONT elems; // elements
…
}
class MyClass ...{
…
};
// partial specialization: both template parameters have same type
template <typename T>
class MyClass<T,T> ...{
…
};
// partial specialization: second type is int
template <typename T>
class MyClass<T,int> ...{
…
};
// partial specialization: both template parameters are pointer types
template <typename T1, typename T2>
class MyClass<T1*,T2*> ...{
…
};
MyClass<int,float> mif; // uses MyClass<T1,T2>
MyClass<float,float> mff; // uses MyClass<T,T>
MyClass<float,int> mfi; // uses MyClass<T,int>
MyClass<int*,float*> mp; // uses MyClass<T1*,T2*>