以模板为参数的模板,顾名思义,就是定义了一个新的模板,这个模板的参数不是类,而是另一个模板,用例子说明就很简单了:
template<size_t size>
class A {
public:
void print(){ cout<<"A size = "<<size<<endl; }
};
template<size_t size>
class B {
public:
void print(){ cout<<"B size = "<<size<<endl; }
};
template<size_t size, template<size_t> class U = A >
class C{
U<size> u;
public:
void print(){u.print();}
};
这里首先定义了一个类模板 A,该模板有一个整数参数,该参数又有一个默认值 10。 A是一个普通的模板,其用法很简单,像 A<> a 或 A<100> a,这样就得到了一个A的实例化类对象。同样,我们定义了一个与A很相似的模板B(B的用途会在稍后说明),接着我们定义了一个新的类模板 C,该模板有两个参数,第一个参数是一个整数,第二参数是一个模板,这就是所谓的以模板为参数的模板,因为它的参数中出现了模板,而不仅仅是整数或类型,可以看到,我们可以在C中像使用普通模板一样使用U,在这里我们给了U一个默认参数:A。下面我们看一下C可以怎么用:
C<100> c1;
c1.print();
C<200,B> c2;
c2.print();
因为C中提供了默认参数,所以在实例化C的时候可以不提供该参数而使用默认参数,像 C<100> c1; 当然,我们也可以提供一个模板作为参数,像 C<200, B> c2; 输出结果如下:
A size = 100
B size = 200