我有
void foo(double &arg, uint8_t *data)
{
// ...
}
template <class T>
void foo(T &arg, uint8_t *data)
{
// ...
}
我在
中调用它template <class ...T>
void bar(T... arg)
{
uint8_t *data = new uint8_t[SOME_VALUE];
// guaranteed to be executed in order
auto list = {(foo(arg, data), 1)...};
// ...
}
但是当使用0参数调用bar时失败,因为在初始化列表中调用foo
的方式。
如何修改此项以使bar
使用空参数包?结果应该好像初始化列表从未执行过。
当我们在foo
中调用bar
时,我希望保持foo
应用程序迭代,即使用bar
中的初始化列表,而不是递归。 {1}}和variadic-template foo
调用自身,直到其参数包为空。 (主要是因为后者似乎代价高昂 - 当包有很多参数时,堆栈会大量下降,并且会导致生成许多不同的foo
模板版本。)
答案 0 :(得分:5)
基本上,问题是auto list = {};
不起作用。
明确指定类型:
std::initializer_list<int> list = {(foo(arg, data), 1)...};
或给它一个额外的元素:
auto list = {1, (foo(arg, data), 1)...};
附注:对于完全通用的代码,如果您不知道foo
的返回类型,则需要将foo
的返回值强制转换为void
,防止可能重载的逗号运算符。