折叠std :: initializer_list的构造函数的参数列表与“常规”折叠

时间:2019-04-27 11:41:51

标签: c++ lambda c++17 fold

我从Jacek Galowicz的C ++ 17 STL Cookbook中学习了C ++ 17,并且有一个关于lambdas的例子:

template <typename... Ts> static auto multicall(Ts... functions)
{
    return [=](auto x) { (void)std::initializer_list<int>{((void)functions(x), 0)...}; };
}

template <typename F, typename... Ts> static auto for_each(F f, Ts... xs)
{
    (void)std::initializer_list<int>{((void)f(xs), 0)...};
}

static auto brace_print(char a, char b)
{
    return [=](auto x) { std::cout << a << x << b << ", "; };
}

int main()
{
    auto f(brace_print('(', ')'));
    auto g(brace_print('[', ']'));
    auto h(brace_print('{', '}'));
    auto nl([](auto) { std::cout << '\n'; });

    auto call_fgh(multicall(f, g, h, nl));

    for_each(call_fgh, 1, 2, 3, 4, 5);
}

为什么在这里使用std::initializer_list以及为什么使用这种void强制转换(作者写道,应该使用reinterpret_cast而不是类似C的强制转换,但是问题是关于为什么使用这种铸件)?

当我将multicallfor_each函数更改为:

template <typename... Ts> static auto multicall(Ts... functions)
{
    return [=](auto x) { (functions(x), ...); };
}

template <typename F, typename... Ts> static auto for_each(F f, Ts... xs)
{
    (f(xs), ...);
}

一切正常,我得到相同的结果。

1 个答案:

答案 0 :(得分:1)

由于某些原因,本书的这一部分似乎采用C ++ 14方式。 在C ++ 17中引入折叠表达式以调用模拟可变参数调用之前,需要使用process.env.someVariable = "some variable"; console.log(process.env); 技巧。在C ++ 17中用逗号运算符折叠绝对合法