受到this question的启发,我开始思考完美的std::pair
应该是什么样子。压缩对类(例如boost's)提供一对,当其中一个类型为空类时,其大小减小。压缩对需要getter(first()
,second()
)来隐藏具有空类型的成员不存在的事实。
其次,根据C++ docs:" Pairs是元组"的特例,但它们是作为一个单独的类实现的。为什么不使用部分模板特化,例如
template <typename ...Args> class tuple {};
template <typename T1, typename T2> class tuple<T1, T2> {}; // Implements a compressed pair
template <typename T1, typename T2> using pair = tuple<T1, T2>;
此外,为了提供更加统一的API,可以为std::get
重载std::set
和pair
,并放弃first()
和second()
个访问者。或者可以同时拥有:)
为什么std::pair
不是std::tuple
的专业化?
何时可以使用std::pair
代替压缩对?即使有案例,默认情况下应该是压缩对吗?
为什么没有压缩的元组类?
答案 0 :(得分:4)
pair
比tuple
早10年。它作为一个单独的类存在,主要是由于历史原因和向后兼容性。对它进行重大改变比它的价值更麻烦。如果有人想要使用两个元素的元组,他们可以使用带有两个元素的元组。
我在使用非人工示例时遇到了麻烦,我认为唯一真正的原因是使用标准库类,并且假设sizeof(pair<A,B>) >= sizeof(A) + sizeof(B)
和类似的代码向后兼容。
没有compressed_tuple
因为std::tuple
已经在每个标准库实现中执行EBO。