异构的可变参数非类型模板参数计数是否灵活?

时间:2012-11-21 23:44:09

标签: c++ templates c++11 variadic-templates

以下定义了一个可变的非类型嵌套类模板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;

1 个答案:

答案 0 :(得分:2)

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

§14.5.3 [temp.variadic]

  

p4 包扩展模式和省略号组成,其实例化在列表中生成零个或多个模式的实例化(如下所述)。模式的形式取决于扩展发生的环境。包扩展可以在以下上下文中发生:

     
      
  • [...]
  •   
  • 在作为包扩展的模板参数包(14.1)中:   
        
    • 如果模板参数包是参数声明;模式是没有省略号的参数声明;
    •   
    • [...]
    •   
  •   
     

p6包扩展[...]的实例化生成一个列表 E 1 ,E 2 ,...,E N ,其中 N 是包扩展参数中的元素数。 [...]

因此,您的示例都会格式不正确,因为DEF将完全采用<int, bool>