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

tow*_*owi 2 c++ templates variadic-templates c++11

我可以定义一个不改变类型而仅针对单个类型的可变参数模板函数吗?如果我的目标是定义一个仅添加可变数字 的函数int,但不添加 float 或其他任何内容,我可以用template<int....>某种语法来做到这一点吗?

我可以轻松组合的多类型示例:

int add() { return 0; }

template<typename T, typename... TS>
T add(T n, TS... m)
  { return n+add(m...); }
Run Code Online (Sandbox Code Playgroud)

但我该如何int只用在这个呢?它显然不能遵循放入<int>模板参数列表的模式,因为我想要一个在 之间接受参数的函数(...),而不是在之间接受参数<...>,如下所示:

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

constant<4>();  // using the int-template function
Run Code Online (Sandbox Code Playgroud)

因此,对我来说很明显,以下内容是行不通的。但作为一个起点...

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

我如何定义addfor add(1)add(1,2)add(1,2,3) ,但仅限于int-Arguments。它不应该生成float- 函数add(1.0)(该调用可能会起作用,但只是因为1.0被转换为int)。

注意:我并不是指任何只会限制类型TTS向下enable_if等的内容。我只是认为我在这里错过了这种可变参数模板的语法。

aar*_*man 5

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

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

现在你可以这样称呼它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...); 
}  
Run Code Online (Sandbox Code Playgroud)

但在我看来,这完全违背了可变参数模板的目的,并且会使程序更难以阅读和编写。