Boost C++ 库

……世界上最受推崇和设计精良的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ 编码规范

PrevUpHomeNext

压缩对

简介
概要
参考
致谢

<boost/compressed_pair.hpp> 的所有内容都在 namespace boost 中定义。

compressed_pairstd::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);
};

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

请注意,如果任一成员是 POD 类型,则 compressed_pair 默认构造函数不会对其进行零初始化:如果您希望这些类型具有默认值,则应自行提供初始值。

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

最后,针对 Visual C++ 6 用户的警告:如果任一参数为空类型,则除非空类型定义了“不执行任何操作”的赋值运算符,否则向该成员赋值将导致内存损坏。这是由于 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