使用空参数包函数参数调用初始化列表中的函数
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
,以防止可能重载的逗号运算符。
我有
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
,以防止可能重载的逗号运算符。