完美的一对

The Perfect Pair

灵感来自 this question I got thinking about what the perfect std::pair should look like. The compressed pair class (e.g. boost's) 提供了一个对,当其中一个类型为空 class 时,其大小会减小。压缩对需要 getter(first()second()),以隐藏具有空类型的成员不存在的事实。

其次,根据 C++ docs:"Pairs are a particular case of tuple",但它们是作为单独的 class 实现的。为什么不使用部分模板特化,例如

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,可以为 pair 重载 std::getstd::set,并放弃 first()second() 访问器。或者两者都可以:)

问题

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

  2. 什么时候可以使用 std::pair 而不是压缩对?而且即使有情况,默认的应该是压缩对吗?

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

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

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

  3. 没有 compressed_tuple 因为 std::tuple 已经在每个值得他们盐分的标准库实现中执行 EBO。