2012-11-21 28 views
0

下面定义了一个可变参数的非类型嵌套类模板DEF。根据为Ts提供的类型参数,非类型模板参数可能是异构的。异构可变参数非类型模板参数计数是否灵活?

template <typename ...Ts> 
struct ABC { 
    template <Ts ...Xs> 
    struct DEF {}; 
}; 

DEF对象可以声明如下:

ABC<int,bool>::DEF<17,true> x; 

我的问题是,可以提供给DEF非类型模板参数的数目小于所提供的的类型的模板的参数数量ABC?例如,这些声明是有效的:

ABC<int,bool>::DEF<17> y; 
ABC<int,bool>::DEF< > z; 

回答

2

不,因为Ts...是一个包扩展。

§14.5.3 [temp.variadic]

P4甲包膨胀图案和省略号,实例化,其中产生所述图案的零个或多个实例在一个列表中的(以下描述)。模式的形式取决于扩展发生的环境。包扩展可以发生在以下上下文中:

  • [...]
  • 在模板参数组是一包扩展(14.1):
    • 如果模板参数包是一个参数 - 声明;该模式是参数声明没有省略号;
    • [...]

P6一包扩展的实例化[...]产生一个列表ë,E ,...,E Ñ,其中N是包扩展参数中元素的数量。 [...]

因此,你的两个例子都是不合格的,因为DEF的确需要<int, bool>

+0

Thankyou Xeo。我想知道这是如何影响“Xs”名称的性质的?您的答案的含义不是这只会给* last *类型指定一个名称吗?我在Clang和GCC看到,使用上面例子中的'Xs ...'可以通过'make_tuple(Xs ...)'扩展来填充'元组(17,true)'。 – user2023370

+1

@user:只是因为'Ts ...'是一个包扩展,并不意味着'Xs'不是一个参数包。 :) – Xeo