编译器只有在生成模板对象的时候才会生成模板类的实例化类定义,然后根据实例化类生成对象。
使用关键字template并指定类型的语句,编译器就会根据这个表达式生成类定义。
template class ArrayTP<string,100>;
要求类模板定义和显式实例化语句在同一命名空间中。
在通用的模板类下,一些类型满足模板类的所有功能要求;但是总有一些特殊类,对于一些功能可能需要特殊化处理;此时就需要用到显式专门化。
比如>符号可以比较两个数据的大小,但是当类型为char *并且指向字符串时,显然>不能比较两字符串的大小,需要使用strcmp(),这就需要更改模板类的相关方法。
template <> class Classname<specialized-type-name>{...};
在通用模板和专门化模板都符合实例化要求时,编译器优先选择专门化模板。
template <> class SortedArray<const char char *>
{
...// details omitted
};
SortedArray<int> scores; // use general definition
SortedArray<const char *> dates; // use specialized definition
部分专门化可以为其中一个类型参数提供特定类型
template <class T1> class Pair<T1, int> {...};
<>中包含的是没有被专门化的;如果<>为空则得到一个显式专门化。
编译器会在符合要求的所有模板中选择专门化程度最高的。
// general template
template <class T1, class T2> class Pair {...};
// specialization with T2 set to int
template <class T1> class Pair<T1, int> {...};
// specialization with T1 and T2 set to int
template <> class Pair<int, int> {...};
Pair<double, double> p1; // use general Pair template
Pair<double, int> p2; // use Pair partial specialization
Pair<int, int> p3; // use Pair explicit specialization
template<class T> // general version
class Feeb { ... };
template<class T*> // pointer partial specialization
class Feeb { ... }; // modified code
Feeb<char> fb1; // use general Feeb template, T is char
Feeb<char *> fb2; // use Feeb T* specialization, T is char
// general template
template <class T1, class T2, class T3> class Trio{...};
// specialization with T3 set to T2
template <class T1, class T2> class Trio<T1, T2, T2> {...};
// specialization with T3 and T2 set to T1*
template <class T1> class Trio<T1, T1*, T1*> {...};
Trio<int, short, char *> t1; // use general template
Trio<int, short> t2; // use Trio
Trio<char, char *, char *> t3; use Trio<T1, T1*, T1*>