在C ++ 11中处理零参数可变参数模板

时间:2015-04-26 15:27:49

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

考虑以下人为例子:

template <typename T, typename... Args>
struct A {
  typedef T Type;
};

A与一个或多个参数一起使用时,如果使用零参数,则按预期方式失败:

  

错误:模板参数数量错误(0,应为1或更多)

如果没有参数,是否可以使A处理定义A::Typeint的零模板参数的情况,如果有的话,是否可以处理第一个模板参数?

2 个答案:

答案 0 :(得分:13)

首先将主模板定义为最常见的情况 - 其中还包括零参数:

template <typename... Args>            //general : 0 or more 
struct A { using Type = int; }

然后部分 1个或更多参数专门化为:

template <typename T, typename... Args> //special : 1 or more
struct A<T,Args...>  { using Type = T; }

一旦你有这个专业化,主模板将用于零参数

请注意,数学 1或更多 0或更多的特殊情况 - 后者是更常见的情况(不是相反)< / em>的

答案 1 :(得分:7)

您只需在第一个参数中添加默认值,无需专门化:

#include <type_traits>

template <typename T = int, typename... >
struct A {
    using type = T;
};

int main() {
    static_assert(std::is_same<A<>::type, int>::value, "");
    static_assert(std::is_same<A<double, char>::type, double>::value, "");
}