模板中的默认args

时间:2010-05-12 18:38:40

标签: c++ templates

是否有可能有这样的事情:

template<class T = unsigned = 64>
class X
{
};

基本上说如果没有指定任何内容,则unsigned应为类型,其值应为64。

2 个答案:

答案 0 :(得分:4)

从字面上看,它没有意义。解释你想先做什么。

C ++中的模板有三种参数:1)类型参数,2)值(非类型)参数,3)模板参数。

当您将参数声明为class T时,它是 type 参数(第一种)。它的“价值”实际上是类型。例如unsigned。即T的“值”为unsigned。在unsigned模板的实例化中,T将替换为class X。参数T不能包含任何数值,例如64

然而,你似乎试图在第1类和第2类参数之间创建某种混合。首先,这是不可能的。其次,没有办法弄清楚它可能具有的语义含义。请澄清你的意图。

如果要传递数值,则必须创建第二种模板参数:值参数,如

template <unsigned N = 64>
class X {
};

因此,您需要首先确定您真正需要的模板参数类型:类型参数或值参数。或者两者都有。您尚未提供有关您的课程X的任何详细信息,因此无法猜测您的目标是什么。

答案 1 :(得分:3)

不是真的。你可以做点接近的事情:


template < typename T = unsigned, T value = 64>
struct X{};

编辑:恍恍惚惚地读到你的另一个答案,如果你真的想要,你可以做些什么:


template < unsigned N = 64 >
struct unsigned_
{
  typedef unsigned type;
  enum { value = N };
};

// alternative versions...int, long, etc...

template < typename T = unsigned_<64> >
struct X {};

这为用户创造了更多的工作。你可以通过使用boost :: enable_if和is_fundamental解决其中一些问题,这样用户可以提供一个基本类型,而不会因为你正在寻找T :: type和T :: value而崩溃。

所以,虽然没有办法完全按照你的意愿去做...取决于你想要获得的丑陋程度,从用户的角度来看,你可能会非常接近。