...one of the most highly regarded and expertly designed C++ library projects in the world.
— Herb Sutter 和 Andrei Alexandrescu, C++ 编码标准
所有 <boost/compressed_pair.hpp>
的内容都在 namespace boost
命名空间内定义。
compressed_pair
类与 std::pair
非常相似。然而,如果任何一个模板参数是空类,则会应用空基类优化来压缩 pair 的大小。
cpp template <class T1, class T2> classcompressed_pair
{ public: typedef T1 first_type; typedef T2 second_type; typedef typenamecall_traits
<first_type>::param_type first_param_type; typedef typenamecall_traits
<second_type>::param_type second_param_type; typedef typenamecall_traits
<first_type>::reference first_reference; typedef typenamecall_traits
<second_type>::reference second_reference; typedef typenamecall_traits
<first_type>::const_reference first_const_reference; typedef typenamecall_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
可以为引用和数组类型实例化,但在这些情况下,可以使用的构造函数范围是有限的。如果类型 T1
和 T2
是相同类型,则只有一个版本的单参数构造函数,并且此构造函数将 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); }