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

Can I define a variadic template function on a single type?

本文关键字:一个 函数 类型 单个 定义 我可以      更新时间:2023-10-16

我可以定义一个可变模板函数而不是一个不断变化的类型,而是一个单一的类型吗?如果我的目标是定义一个只添加可变数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<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...); }

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

注意:我的意思不是仅仅用enable_if之类的东西来约束类型TTS。我只是觉得这类变体模板可能有一个语法,我在这里错过了。

为此,您实际上应该只使用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这完全违背了可变模板的目的,并将使程序更难读写。

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

这样的代码出了什么问题?