我可以在单一类型上定义可变参数模板函数吗?

时间:2013-12-14 19:16:13

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

我可以定义一个可变参数模板函数而不是更改类型,但仅限于一个吗?如果我的目标是定义一个只添加可变数量的int但不是浮点数或其他任何东西的函数,我可以用template<int....>语法以某种方式做到这一点吗?

我可以轻松组合多种样品:

int add() { return 0; }

template<typename T, typename... TS>
T add(T n, TS... m)
  { return n+add(m...); }

但是我如何仅在此使用int? 显然不能按照模式将<int>放在template-argument-list中,因为我想要一个在(...)之间而不是<...>之间接受参数的函数,如下所示: / p>

template<int n>
int constant() { return n; }

constant<4>();  // using the int-template function

因此,很明显,以下内容不起作用。但作为一个起点...

template<int, int...>
int add(int n, int... m)    // error, of course.
  { return n+add(m...); }

如何为addadd(1)add(1,2)等定义add(1,2,3),但仅针对int - 参数。它不应为float生成add(1.0) - 函数(可能是调用有效,但只是因为1.0转换为int)。

注意:我并不是指将TTS类型限制在enable_if之类的任何内容。我只是觉得这里可能存在这种可变参数模板的语法。

2 个答案:

答案 0 :(得分:4)

为此,您应该只使用std::initializer_list,这与仅一种类型的可变参数函数非常相似。

int add(std::initializer_list<int> list) {
    int sum = 0;
    for (auto i : list) sum += i;
    return sum;
}  

现在您可以像int i = add({1,2,3,4,5,6});

一样调用它

如果你真的想要,你可以轻松地设置静态断言,为你做这件事。

int add() { return 0; }

template<typename T, typename... TS>
T add(T n, TS... m)
{
   static_assert(std::is_same<T,int>::value,"bad type"); 
   return n+add(m...); 
}  

但IMO完全违背了可变参数模板的目的,并且会使程序更难以读写。

答案 1 :(得分:3)

int add() { return 0; }

template<typename... TS>
int add(int n, TS... m)
{
    return n + add(m...); 
}

此类代码有什么问题?