如何用默认参数类型实例化模板

ZDNet软件频道 时间:2004-11-16 作者:Builder.com |  我要评论()
本文关键词:cpptips DannyKalev
模板可以具有默认参数。在实例化(具体化)这样一个具有默认参数的模板时,如果你不显式地指定参数,编译器会插入这些默认参数。
本文译自Builder.com,未经许可请勿转载

模板可以具有默认参数。在实例化(具体化)这样一个具有默认参数的模板时,如果你不显式地指定参数,编译器会插入这些默认参数。标准库(Standard Library)使用这一特性非常多,(比如说)这样就能够使你忽略掉 STL 容器的分配器(allocator)和traits classes。

下面的类模板有两个模板参数T1 和 T2,每个参数有一个默认值:

template < class T1=char, class T2=int >
class C
{
 public:
  C (T1 t1, T2 t2) : m1(t1), m2 (t2) {}
 private:
  T1 m1;
  T2 m2;
//..
};

如同一般的具有默认参数值的函数一样,如果一个模板参数具有一个默认值,所有后续模板参数必须也要具有默认参数:

template <class T1=int, class T2> class X;   // error
template <class T1, class T2=int> class Y;   // OK

实例化

在实例化这样的模板时,你可以忽略一些或全部具有默认值的参数,或者不忽略具有默认值的参数。下面的例子展示了模板 C 的两个具体化过程。第一个实例显式地指定了所有的参数;第二个忽略了最后一个参数:

int main()
{
 C < int, double > c1(0,0.0); // no defaults used
 C < bool > c2(true, 6); // OK, second arg defaults to int
}

在具体化时,如果模板的所有参数都具有默认值并且都使用默认值,那么要在模板的名称后提供一对空的尖括号。忽略掉空的尖括号是一个错误:

C e3( 'a', 8);   //error; missing < >
C <> e4 ('a', 8);   //OK, instantiates C <char, int>


Danny Kalev 是一位具有14年经验的系统分析家、软件工程师,尤其擅长C++ 和面向对象设计。


责任编辑:李宁

欢迎评论投稿

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134