为什么STL算法没有为std :: tuple重载?

时间:2018-05-23 08:31:10

标签: c++ tuples std-pair stl-algorithm stdtuple

我想知道为什么某些STL算法没有重载才能使它们与元组一起使用。有些人,我指那些不重新排序元素的人。一个很好的例子可能是std::for_each

是否存在语言限制,例如可能无法混合编译时评估和运行时评估?让我澄清最后一句:

我知道迭代本身需要成为编译时迭代,然后必须定义编译时迭代器才能使用编译时std::get<>来获取值。之后,应该可以将模板化的lambda应用于元组中的每个异构类型,但是该类型的值随后将进行运行时评估。

我认为这应该是可能的,即使我个人不知道从哪里开始。我看到完全看起来不像std::for_each的实现来实现相同的结果。为什么会这样?

(注意:&#39; tuple&#39;我的意思是std::pairstd::tuple

2 个答案:

答案 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已经实现了这种迭代。也许它有一天会成为标准的一部分,就像之前许多其他的升级库一样。