Fly*_*Hat 0 c++ templates variadic-templates c++11
我有
void foo(double &arg, uint8_t *data)
{
// ...
}
template <class T>
void foo(T &arg, uint8_t *data)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
我打电话给它
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)...};
// ...
}
Run Code Online (Sandbox Code Playgroud)
但是当使用0参数调用bar时它会失败,因为foo在初始化列表中调用了该方法.
如何修改它以bar使用空参数包?结果应该好像初始化列表从未执行过.
我想保持foo应用程序迭代,即使用初始化列表bar,而不是递归,当我们对fooin 进行单个调用时bar,variadic-template foo调用自身直到其参数包为空.(主要是因为后者看起来成本很高 - 当包有很多参数时,堆栈会掉落很多,并且会导致生成很多不同的模板版本foo.)
基本上,问题是auto list = {};不起作用.
要么明确指定类型:
std::initializer_list<int> list = {(foo(arg, data), 1)...};
Run Code Online (Sandbox Code Playgroud)
或者给它一个额外的元素:
auto list = {1, (foo(arg, data), 1)...};
Run Code Online (Sandbox Code Playgroud)
附注:对于完全通用的代码,当你不知道的返回类型foo,你想投的返回值foo来void,来抵御可能重载逗号操作符.