【发布时间】:2016-02-11 23:38:24
【问题描述】:
为什么std::pair<A,B> 与std::tuple<A,B> 不一样?不能只用一个代替另一个总是感觉很奇怪。它们在某种程度上是可转换的,但有一些限制。
我知道std::pair<A,B>需要有A first和B second这两个数据成员,所以不能只是std::tuple<A,B>的类型别名。但我的直觉告诉我们,我们可以专门化std::tuple<A,B>,这是一个正好有两个元素的元组,等于标准要求std::pair 的定义。然后将其别名为std::pair。
我想这是不可能的,因为它太简单了以至于没有想到,但它并没有在 g++ 的 libstdc++ 中完成(我没有查看其他库的源代码)。这个定义的问题是什么?是否“只是”会破坏标准库的二进制兼容性?
【问题讨论】:
-
@Revolver_Ocelot Modern
tuple实现不是递归的。 -
@leemes 如果你想要
pair,请将你的东西声明为pairs。如果您想让事情更通用,无论如何都不能使用first和second。 IE。这一切的目的是什么? -
@leemes 您的草图完全无法编译,以防您没有注意到。沿着这些思路的任何事情都会使从
tuple<Ts...>中推断出模板参数是不可能的。 -
std::pair已经是 C++98 的 bean 部分,std::tuple(但没有可变参数模板)随 TR1 一起提供。当时,由于多种原因,无法将具有 2 个元素的tuple别名为pair。 C++11 附带模板别名和可变参数模板。即使有了这个,你也不能在不破坏一些现有代码的情况下将pair与tuple的特化合并。 -
TR1 的
tuple和 C++11 的tuple不需要相同——这就是 TR1 的重点。