<boost/compressed_pair.hpp>
的所有内容都在 namespace boost
中定义。
类 compressed_pair
与 std::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); };
可以使用成员函数 first()
和 second()
访问对的两个成员。请注意,并非所有成员函数都可以为所有模板参数类型实例化。特别是,compressed_pair
可以为引用和数组类型实例化,但在这些情况下,可以使用构造函数的范围受到限制。如果类型 T1
和 T2
是相同的类型,则只有一个版本的单参数构造函数,并且此构造函数将对中的两个值都初始化为传递的值。
请注意,如果任一成员是 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); }