Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

Compressed Pair

简介
概要
参考
致谢

所有 <boost/compressed_pair.hpp> 的内容都在 namespace boost 命名空间内定义。

compressed_pair 类与 std::pair 非常相似。然而,如果任何一个模板参数是空类,则会应用空基类优化来压缩 pair 的大小。

cpp
template <class T1, class T2>
class compressed_pair
{
public:
    typedef T1                                                 first_type;
    typedef T2                                                 second_type;
    typedef typename call_traits<first_type>::param_type       first_param_type;
    typedef typename call_traits<second_type>::param_type      second_param_type;
    typedef typename call_traits<first_type>::reference        first_reference;
    typedef typename call_traits<second_type>::reference       second_reference;
    typedef typename call_traits<first_type>::const_reference  first_const_reference;
    typedef typename call_traits<second_type>::const_reference second_const_reference;

             compressed_pair() : base() {}
             compressed_pair(first_param_type x, second_param_type y);
    explicit compressed_pair(first_param_type x);
    explicit compressed_pair(second_param_type y);

    compressed_pair& operator=(const compressed_pair&);

    first_reference       first();
    first_const_reference first() const;

    second_reference       second();
    second_const_reference second() const;

    void swap(compressed_pair& y);
};

pair 的两个成员可以使用成员函数 first()second() 访问。请注意,并非所有成员函数都可以为所有模板参数类型实例化。特别是,compressed_pair 可以为引用和数组类型实例化,但在这些情况下,可以使用的构造函数范围是有限的。如果类型 T1T2 是相同类型,则只有一个版本的单参数构造函数,并且此构造函数将 pair 中的两个值都初始化为传递的值。

请注意,如果任何成员是 POD 类型,则该成员不会被 compressed_pair 默认构造函数零初始化:如果您希望这些类型具有默认值,则需要您提供初始值。

请注意,如果任何一个模板参数是联合体类型,则 compressed_pair 无法实例化,除非编译器支持 boost::is_union,或者如果 boost::is_union 针对联合体类型进行了特化。

最后,对 Visual C++ 6 用户的警告:如果任何参数是空类型,则对该成员赋值将产生内存损坏,除非空类型定义了“do nothing”赋值运算符。这是由于 VC6 生成隐式赋值运算符的方式存在错误。

参考

namespace boost {
  template<typename T1, typename T2> class compressed_pair;

  template<typename T> class compressed_pair<T, T>;
  template<typename T1, typename T2> 
    void swap(compressed_pair< T1, T2 > & x, compressed_pair< T1, T2 > & y);
}

基于 Steve Cleary, Beman Dawes, Howard Hinnant 和 John Maddock 的贡献。

John Maddock 维护。


PrevUpHomeNext