我想知道为什么某些STL算法没有重载才能使它们与元组一起使用。有些人,我指那些不重新排序元素的人。一个很好的例子可能是std::for_each
。
是否存在语言限制,例如可能无法混合编译时评估和运行时评估?让我澄清最后一句:
我知道迭代本身需要成为编译时迭代,然后必须定义编译时迭代器才能使用编译时std::get<>
来获取值。之后,应该可以将模板化的lambda应用于元组中的每个异构类型,但是该类型的值随后将进行运行时评估。
我认为这应该是可能的,即使我个人不知道从哪里开始。我看到完全看起来不像std::for_each
的实现来实现相同的结果。为什么会这样?
(注意:&#39; tuple&#39;我的意思是std::pair
和std::tuple
)
答案 0 :(得分:3)
STL算法使用迭代器,它与std::tuple
不兼容。
std::tuple
附带了自己的一组功能,因此您的for_each
可能会使用std::apply
完成:
std::apply([](const auto&... args)
{
((std::cout << args << std::endl), ...); // C++17 Fold expression
}, t);
答案 1 :(得分:1)
首先,元组本身不是容器。当然,您可以使用它们来存储数据,但它完全(或至少可以)完全异构。这让我们怀疑您为什么要迭代异构数据?在大多数情况下,我认为没有理由。大多数情况下,当您迭代某些内容时,您希望使用迭代类型中的相似性来简化您使用熟悉对象的工作。
当你想要迭代元组时,当然还有模板的角落情况等等。但我想这些很少见,可以为标准地狱提供大量的代码和模板魔法,以达到我们想要的效果。无论如何,boost fusion已经实现了这种迭代。也许它有一天会成为标准的一部分,就像之前许多其他的升级库一样。