为什么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 ++中完成(例如我没有查看其他库的源代码) )。这个定义的问题是什么?它是否“会”破坏标准库的二进制兼容性?
答案 0 :(得分:3)
你必须小心SFINAE和重载等事情。例如,下面的代码目前格式正确,但您会将其视为非法:
void f(std::pair<int, int>);
void f(std::tuple<int, int>);
目前,我可以通过重载解析,SFINAE,模板专业化等消除对和元组之间的歧义。如果你把它们做成同样的事情,这些工具都会变得无法区分它们。这会破坏现有代码。
可能有机会将其作为C ++ 11的一部分引入,但现在肯定没有。
答案 1 :(得分:2)
这纯粹是历史性的。自{+ C} 98以来存在std::pair
,而元组之后出现,并且最初不是标准的一部分。
向后兼容性是C ++发展的最大负担,阻止了一些很好的事情!
答案 2 :(得分:0)
我没试过这个,现在没有带宽这么做。您可以尝试对std :: tuple进行专门化,派生自sd :: pair。有人请告诉我这不会起作用,或者是特别可怕的想法。我怀疑你遇到了访问者的问题。