是否可以不为类型变化的模板函数定义类型,而仅为单个函数定义?如果我的目标是定义一个仅添加可变数量的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的模式,因为我想要一个函数,该函数在(...)
和之间不接受参数,<...>
如下所示:
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
-Arguments。它不应该为生成float
-function add(1.0)
(可能是该调用将起作用,但仅是因为1.0
将其转换为int
)。
注:我这样做,只会限制类型没有任何意义T
或TS
打倒enable_if
或此类。我只是认为我在这里可能错过了这种可变参数模板的语法。
为此,您实际上应该只使用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...);
}
但是,这完全违背了可变参数模板的目的,并使程序更难于读写。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句