gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 16:10:42 26 4
gpt4 key购买 nike

我有

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,以防止逗号运算符可能过载。

关于c++ - 使用空参数包函数参数调用初始化列表中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29042969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com