我可以定义一个可变参数模板函数而不是更改类型,但仅限于一个吗?如果我的目标是定义一个只添加可变数量的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...); }
如何为add
,add(1)
,add(1,2)
等定义add(1,2,3)
,但仅针对int
- 参数。它不应为float
生成add(1.0)
- 函数(可能是调用有效,但只是因为1.0
转换为int
)。
注意:我并不是指将T
或TS
类型限制在enable_if
之类的任何内容。我只是觉得这里可能存在这种可变参数模板的语法。
答案 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...);
}
此类代码有什么问题?