使用空参数包函数参数调用初始值设定项列表中的函数

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

本文关键字:函数 参数 列表 调用 包函数      更新时间:2023-10-16

我有

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 中使用初始值设定项列表,而不是递归,当我们在 bar 中对 foo 进行单次调用时,可变模板foo调用自身直到其参数包为空。(主要是因为后者似乎成本高昂——当包有很多参数时,堆栈会失败很多,并且会导致生成许多不同的模板版本的foo

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

显式指定类型:

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

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

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

旁注:对于完全通用的代码,当您不知道foo的返回类型时,您需要将 foo 的返回值强制转换为 void,以防止可能重载的逗号运算符。