什么是遍历std::tuple的简便方法?

3

目前我认为我能够做到以下几点:

apply([](auto&... e) { forward_as_tuple((e.do_something(), 0)...); }, t);

这里的 t 是元组。这种方式不容易阅读。还有其他的方式吗?谢谢。


1
用fold表达式替换forward_as_tuple - Piotr Skotnicki
这是一个更简单的例子,与https://dev59.com/iWbWa4cB1Zd3GeqPcv5X有关。 - MSalters
https://dev59.com/G3M_5IYBdhLWcg3w2XLw#37100178 - smac89
1个回答

4
基本上不行。因为元组是异构的,所以你不能有这样的东西:
for (auto e : my_tuple)

因为在每次迭代中,e 可能需要是不同的类型 - 这是与语言中我们所习惯的迭代非常不同的一种迭代方式。提案 P1306 提出了一种全新的 for 循环来解决这个问题,称为 for...
现在,我说你在每次迭代中需要不同类型并不是严格的真实情况。如果你的 tuple 是同构的,你可以将其转换为 std::array。即使你的 tuple 是异构的,仍然可以将其转换为一个由所有唯一类型组成的 std::any 数组或 std::variant<Ts...> 数组,其中包含 tuple 包含的所有唯一类型。也许这解决了你的问题,也可能不是。
否则,今天的语言中唯一的方法是通过新作用域展开你的元组。这可以是 std::apply(它一次性给你 所有 元素)或者你可以编写自己的版本,它逐个传递一个元素,这样你就会得到一元 lambda。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接