使用std :: apply迭代元组元素

Yam*_*ari 5 c++ lambda tuples c++17

我想要一种方法将一个函数应用于给定元组的每个元素,我想出了一个解决方案,在下面的例子中进行了演示.

int main()
{
    std::apply([](auto&&... xs)
               { 
                   [](...){}(([](auto&& x){ std::cout << x << "\n"; }(std::forward<decltype(xs)>(xs)), false)...); 
               }, std::make_tuple(1, 2.f, 3.0));
}
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,除了元组元素似乎以反转顺序处理,导致以下输出:

3
2
1

谁能告诉我为什么?

Col*_*mbo 8

[](...){}评估内部空lambda的参数的顺序是未指定的(即使在评估顺序上论文之后).

只需在逗号运算符上使用折叠:

std::apply([](auto&&... xs) {
               ((std::cout << std::forward<decltype(xs)>(xs) << '\n'), ...); },
           std::make_tuple(1, 2.f, 3.0));
Run Code Online (Sandbox Code Playgroud)

演示.或cout直接二进制折叠.一旦我们引入了一个"packize"运算符,已经有一个提议(使用[:]),你也可以写(std::cout << [:]tup << '\n'), ....