在很多模板库中,都用到了C++的部分实例化。
所谓部分实例化,是这样的
template<class T> class A { // 主模板
int x;
};
template<class T> class A<T*> { // 半实例化模板
long x;
};
template<template<class U> class V> class C {
V<int> y;
V<int*> z;
};
C<A> c;
C<A>::V<int> 使用的是主模板,因此c.y.x 类型为int;
C<A>::V<int*> 使用的是半实例化的模板,因此c.z.x类型为long.
再有例子
template<int I, int J, class T> class X { }; // #1
template<int I, int J> class X<I, J, int> { }; //#2
template<int I> class X<I, I, int> { }; //#3
template<int I, int J> void f(X<I, J, int>); //#A
template<int I> void f(X<I, I, int>); //#B
模板#1是主模板,#2和#3是半实例化的模板,其中#3的实例化程度要比#2要高。所以,函数 #B使用的是模板#3而不是模板#2。函数#A使用模板#2。