完美的一对

时间:2016-06-16 08:11:10

标签: c++ templates stl std-pair stdtuple

受到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::setpair,并放弃first()second()个访问者。或者可以同时拥有:)

问题

  1. 为什么std::pair不是std::tuple的专业化?

  2. 何时可以使用std::pair代替压缩对?即使有案例,默认情况下应该是压缩对吗?

  3. 为什么没有压缩的元组类?

1 个答案:

答案 0 :(得分:4)

  1. pairtuple早10年。它作为一个单独的类存在,主要是由于历史原因和向后兼容性。对它进行重大改变比它的价值更麻烦。如果有人想要使用两个元素的元组,他们可以使用带有两个元素的元组。

  2. 我在使用非人工示例时遇到了麻烦,我认为唯一真正的原因是使用标准库类,并且假设sizeof(pair<A,B>) >= sizeof(A) + sizeof(B)和类似的代码向后兼容。

  3. 没有compressed_tuple因为std::tuple已经在每个标准库实现中执行EBO。