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

Calling a function inside an initializer list with an empty parameter pack function argument

我有

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 使用空参数包?结果应该就像初始化列表从未执行过一样。

当我们在 bar 和 variadic-template foo 调用自身直到它的参数包为空。 (主要是因为后者似乎代价高昂——当包有很多参数时,堆栈会失败很多,它会导致生成很多不同的模板版本 foo。)

基本上,问题是 auto list = {}; 不起作用。

要么明确指定类型:

std::initializer_list<int> list = {(foo(arg, data), 1)...};

或者给它一个额外的元素:

auto list = {1, (foo(arg, data), 1)...};

旁注:对于完全通用的代码,当您不知道 foo 的 return 类型时,您需要转换 [=13] 的 return 值=] 到 void,以防止可能重载的逗号运算符。