使用 std::apply 遍历元组元素
Iterate over tuple elements with std::apply
我想实现一种将函数应用于给定元组的每个元素的方法,我想出了一个解决方案,在以下示例中进行了演示。
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));
}
除了元组元素似乎以倒置顺序处理外,这似乎工作正常,导致以下输出:
3
2
1
谁能告诉我为什么?
内部空 lambda [](...){}
的参数的计算顺序未指定(即使在 paper on evaluation order 之后)。
只需在逗号运算符上使用折叠:
std::apply([](auto&&... xs) {
((std::cout << std::forward<decltype(xs)>(xs) << '\n'), ...); },
std::make_tuple(1, 2.f, 3.0));
Demo。或者直接对 cout
进行二进制折叠。一旦我们引入了一个 "packize" 运算符,已经有一个提案(使用 [:]
),你也可以写成 (std::cout << [:]tup << '\n'), ...
.
我想实现一种将函数应用于给定元组的每个元素的方法,我想出了一个解决方案,在以下示例中进行了演示。
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));
}
除了元组元素似乎以倒置顺序处理外,这似乎工作正常,导致以下输出:
3
2
1
谁能告诉我为什么?
内部空 lambda [](...){}
的参数的计算顺序未指定(即使在 paper on evaluation order 之后)。
只需在逗号运算符上使用折叠:
std::apply([](auto&&... xs) {
((std::cout << std::forward<decltype(xs)>(xs) << '\n'), ...); },
std::make_tuple(1, 2.f, 3.0));
Demo。或者直接对 cout
进行二进制折叠。一旦我们引入了一个 "packize" 运算符,已经有一个提案(使用 [:]
),你也可以写成 (std::cout << [:]tup << '\n'), ...
.