完美的一对
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::get
和 std::set
,并放弃 first()
和 second()
访问器。或者两者都可以:)
问题
为什么 std::pair
不是 std::tuple
的特化?
什么时候可以使用 std::pair
而不是压缩对?而且即使有情况,默认的应该是压缩对吗?
为什么没有压缩元组class?
pair
早于 tuple
整整 10 年。它作为一个单独的 class 存在,主要是由于历史原因和向后兼容性。对其进行重大更改带来的麻烦多于它的价值。如果有人想要包含两个元素的元组,他们可以只使用包含两个元素的元组。
我无法使用非人工示例,我认为唯一真正的原因是使用标准库 classes,并且向后兼容假设 sizeof(pair<A,B>) >= sizeof(A) + sizeof(B)
和类似的代码.
没有 compressed_tuple
因为 std::tuple
已经在每个值得他们盐分的标准库实现中执行 EBO。
灵感来自 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::get
和 std::set
,并放弃 first()
和 second()
访问器。或者两者都可以:)
问题
为什么
std::pair
不是std::tuple
的特化?什么时候可以使用
std::pair
而不是压缩对?而且即使有情况,默认的应该是压缩对吗?为什么没有压缩元组class?
pair
早于tuple
整整 10 年。它作为一个单独的 class 存在,主要是由于历史原因和向后兼容性。对其进行重大更改带来的麻烦多于它的价值。如果有人想要包含两个元素的元组,他们可以只使用包含两个元素的元组。我无法使用非人工示例,我认为唯一真正的原因是使用标准库 classes,并且向后兼容假设
sizeof(pair<A,B>) >= sizeof(A) + sizeof(B)
和类似的代码.没有
compressed_tuple
因为std::tuple
已经在每个值得他们盐分的标准库实现中执行 EBO。