頭文件 <boost/compressed_pair.hpp>

文件 <boost/compressed_pair.hpp> 中的所有內容都定義在 boost 名稱空間中。

類 compressed pair 和 std::pair 非常相似,但是有一點不同:當這個類的任何一個模板參數為空類(empty classes),編譯器就會應用“空基類優化(empty base-class optimisation)”來壓縮 pair 的大小。

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() 和 last() 來訪問。注意,對於有些模板參數類型來說,並非這兩個方法都能被實具現化。具體來說,compressed_pair 可以使用引用類型和數組類型來具現化,但是並非所有的構造函數都一定可用。如果類型 T1 和 T2 是同一種類型,那麼就只有一個接收單個參數的構造函數,這個構造函數把 pair 中的兩個值都初始化為參數的值。

注 意,如果有一個成員是 POD(Plain Old Data) 類型,那麼這個成員就不會被默認構造函數初始化為“0”,如果你需要給它指定一個初始值的話,請調用有參數的構造函數。

注意,compressed_pair 不能使用 union 類型作為模板參數來具現化,除非編譯器支持 boost::is_union,或 boost::is_union 針對該 union 類型進行了偏特化。 

最後,使用 Visual C++ 6 的用戶需要注意:如果任何一個模板參數為“空”類型,那麼對該成員賦值將導致內存被破壞,除非為該“空白 ”類定義一個什麼都不做的賦值運算符。這是因為 VC 6 在生成隱含的複製運算符時存在bug。

鳴謝

Based on contributions by Steve Cleary, Beman Dawes, Howard Hinnant and John Maddock.

Maintained by John Maddock, the latest version of this file can be found at www.boost.org, and the boost discussion list at www.yahoogroups.com/list/boost.


Revised 07 November 2007

© Copyright Beman Dawes, 2000.

Distributed under the Boost Software License, Version 1.0. See www.boost.org/LICENSE_1_0.txt