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

时间:2015-03-13 22:24:54

标签: c++ templates c++11 variadic-templates

我有

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模板版本。)

1 个答案:

答案 0 :(得分:5)

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

明确指定类型:

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

或给它一个额外的元素:

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

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