使用空参数包函数参数调用初始化列表中的函数

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.)

T.C*_*.C. 5

基本上,问题是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,你想投的返回值foovoid,来抵御可能重载逗号操作符.