为什么std :: pair <a,b>与std :: tuple <a,b>不一样? (真的没办法吗?)

时间:2016-02-11 23:38:25

标签: c++ c++11 stl tuples

为什么std::pair<A,B>std::tuple<A,B>不一样?不能用另一个替换一个人总是感到奇怪。它们有点可兑换,但也有局限性。

我知道std::pair<A,B>需要拥有两个数据成员A firstB second,因此它不能只是std::tuple<A,B>的类型别名。但是我的直觉说我们可以专门化std::tuple<A,B>,即具有两个元素的元组,以等于标准要求std::pair的定义。然后将其别名为std::pair

我想这是不可能的,因为它太直接而不被人们想到了,但它没有在g ++的libstdc ++中完成(例如我没有查看其他库的源代码) )。这个定义的问题是什么?它是否“会”破坏标准库的二进制兼容性?

3 个答案:

答案 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。有人请告诉我这不会起作用,或者是特别可怕的想法。我怀疑你遇到了访问者的问题。