类模板
类模板最常见的应用就是容器,比如我们常用的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
template
<
typename T, typename CONT
=
std::vector
<
T
>
>
class
Stack
...
{
private:
CONT elems; // elements
…
}
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*>