## Tuple
### 頭文件: `"boost/tuple/tuple.hpp"`
它包含了 `tuple` 類模板及庫的核心部分。
```
Header: "boost/tuple/tuple_io.hpp"
```
包含了對 `tuple` 的輸入輸出操作符。
```
Header: "boost/tuple/tuple_comparison.hpp"
```
包含了 `tuple` 的關系操作符。
Tuple 庫位于 `boost` 里的嵌套名字空間 `boost::tuples` 中。要使用 tuples, 需要包含 "`boost/tuple/tuple.hpp"`, 它包含了核心庫。要進行輸入輸出操作,就包含 `"boost/tuple/tuple_io.hpp"`, 要支持 `tuple` 的比較,就包含 `"boost/tuple/tuple_comparison.hpp"`. 有些 Boost 庫提供一個包含了所有相關庫的頭文件以方便使用;但 Boost.Tuple 沒有。原因是把庫分到各個不同的頭文件中可以減少編譯時間;如果你不使用關系操作符,你就無須為此付出時間和依賴性的代價。為了方便使用,Tuple 庫中有些名字位于名字空間 `boost`:如 `tuple`, `make_tuple`, `tie`, 和 `get`. 以下是 Boost.Tuple 的部分摘要,列出并簡要討論了最主要的一些函數。
```
namespace boost {
template <class T1,class T2,...,class TM> class tuple {
public:
tuple();
template <class P1,class P2...,class PM>
tuple(class P1,class P2,...,PN);
template <class U1,class U2,...,class UN>
tuple(const tuple<U1,U2,...,UN>&);
tuple& operator=(const tuple&);
};
template<class T1,class T2,...,class TN> tuple<V1,V2,...,VN>
make_tuple(const T1& t1,const T2& t2,...,const TN& tn);
template<class T1,class T2,...,class TN> tuple<T1&,T2&,...,TN>
tie(T1& t1,T2& t2,...,TN& tn);
template <int I,class T1,class T2,...,class TN>
RI get(tuple<T1,T2,...,TN>& t);
template <int I,class T1,class T2,...,class TN>
PI get(const tuple<T1,T2,...,TN>& t);
template <class T1,class T2,...,class TM,
class U1,class U2,...,class UM>
bool operator==(const tuple<T1,T2,...,TM>& t,
const tuple<U1,U2,...,UM>& u);
template <class T1,class T2,...,class TM,
class U1,class U2,...,class UM>
bool operator!=(const tuple<T1,T2,...,TM>& t,
const tuple<U1,U2,...,UM>& u);
template <class T1,class T2,...,class TN,
class U1,class U2,...,class UN>
bool operator<(const tuple<T1,T2,...,TN>&,
const tuple<U1,U2,...,UN>&);
}
```
### 成員函數
```
tuple();
```
`tuple` 的缺省構造函數初始化所有元素,這意味著這些元素必須是可以缺省構造的,它們必須有一個公有的缺省構造函數。任何從這些所含元素的構造函數拋出的異常都會被傳播。
```
template <class P1,class P2...,class PM>
tuple(class P1,class P2,...,PN);
```
這個構造函數接受一些參數,用于初始化 `tuple` 相應元素。對于一些帶有非缺省構造類型的 `tuple` ,就需要用這種構造方式;不能缺省構造一個 `tuple` 而不構造它的所有元素。例如,引用類型的元素必須在構造時初始化。注意,參數的數量不必與 tuple 類型中的元素數量一致。可以僅給出部分元素的值,而讓剩余元素初始化為缺省值。任何從元素的構造函數拋出的異常都會被傳播。
```
template <class U1,class U2,...,class UN>
tuple(const tuple<U1,U2,...,UN>&);
```
這個構造函數用來自另一個 tuple 的元素來進行初始化,要求被構造的 tuple (`T1`, `T2`,…,`TM`) 的每一個元素都必須可以從 (`U1`,`U2`,…,`UN`) 構造。任何從元素的構造函數拋出的異常都會被傳播。
```
TIndex & get<int Index>();
const TIndex & get<int Index>() const;
```
返回位于給定的 `Index` 處的元素的引用。`Index` 必須是一個常量整型表達式;如果索引大于或等于 `tuple` 中的元素數量,將產生一個編譯期錯誤。結果的類型通過相應的模板參數 `TIndex` 給出。
```
tuple& operator=(const tuple& other);
```
tuple 的賦值要求兩個 tuples 具有相同的長度和元素類型。`*this` 中的每一個元素被賦值為 `other` 的對應元素。元素賦值中的任何異常都會被傳播。
### 普通函數
```
template<class T1,class T2,...,class TN> tuple<V1,V2,...,VN>
make_tuple(const T1& t1,const T2& t2,...,const TN& tn);
```
函數模板 `make_tuple` 是 `tuple` 版本的 `std::make_pair`. 它使用函數模板參數推斷來決定一個包含這些參數的 `tuple` 的元素類型。創建這個 `tuple` 的元素類型時不使用這些參數的高級 cv-限定符。要控制對引用類型的類型推斷,可以使用 Boost.Ref 的工具 `ref` 和 `cref` 來包裝這些參數,從而影響返回的 tuple 結果類型。(稍后我們將看到關于 `ref` 和 `cref` 的更多內容)?
```
template<class T1,class T2,...,class TN> tuple<T1&,T2&,...,TN>
tie(T1& t1,T2& t2,...,TN& tn);
```
函數模板 `tie` 類似于 `make_tuple`. 調用 `tie(t1,t2,...,tn)` 等同于調用 `make_tuple(ref(t1),ref(t2)... ref(tn))`,即它創建一個由函數參數的引用組成的 `tuple` 。實際結果是把一個 `tuple` 賦值為由 `tie` 創建的對象,拷貝源 `tuple` 的元素到 `tie` 的參數。這樣,`tie` 可以很容易地從一個由函數返回的 `tuple` 拷貝值到一個已有變量中。你也可以讓 `tie` 從一個 `std::pair` 創建一個 2-tuple 。
```
template <int I,class T1,class T2,...,class TN>
RI get(tuple<T1,T2,...,TN>& t);
```
這個函數 `get` 的重載版本用于取出 `tuple t` 的一個元素。索引 `I` 必須位于范圍 [0..N),?N 為 `tuple` 中的元素數量。如果 `TI` 是一個引用類型,則`RI` 為 `TI`; 否則, `RI` 為 `TI&`.
```
template <int I,class T1,class T2,...,class TN>
RI get(const tuple<T1,T2,...,TN>& t);
```
這個函數 `get` 用于取出 `tuple t` 的一個元素。索引 `I` 必須位于范圍 [0..N),?N 為 `tuple` 中的元素數量。如果 `TI` 是一個引用類型,則`RI` 為 `TI`; 否則, `RI` 為 `const TI&`.
### 關系操作符
```
bool operator==(
const tuple<T1,T2,...,TN>& lhs,
const tuple<U1,U2,...,UN>& rhs);
```
如果對于所有位于范圍[0..N)的 `i`,都有 `get<i>(lhs)==get<i>(rhs)` ,N 為元素數量,則相等操作符返回 `true` 。這兩個 `tuple`s 必須具有相同數量的元素。對于 N=0 的空 `tuple` ,總是返回 `true` 。
```
bool operator!=(
const tuple<T1,T2,...,TN>& lhs,
const tuple<U1,U2...,...,>& rhs);
```
如果對于任意一個位于范圍[0..N)的 `i`,有 `get<i>(lhs)!=get<i>(rhs)` ,N 為元素數量,則不等操作符返回 `true` 。這兩個 `tuple`s 必須具有相同數量的元素。對于 N=0 的空 `tuple` ,總是返回 `false` 。
```
bool operator<(
const tuple<T1,T2,...,TN>& lhs,
const tuple<U1,U2,...,UN>& rhs);
```
如果對于任意一個位于范圍[0..N)的 `i`,有 `get<i>(lhs)<get<i>(rhs)` ,N 為元素數量,則小于操作符返回 `true` ;假如對每個比較都返回 `false`,則表達式 `!(get<i>(rhs)<get<i>(lhs))` 為 `true`;否則表達式為 `false`。這兩個 `tuple`s 必須具有相同數量的元素。對于 N=0 的空 `tuple` ,總是返回 `true` 。
值得注意的是,對于所有支持的關系操作符(operators `==`, `!=`, `<`, `>`, `<=`, 和 `>=`), 兩個 `tuple`s 必須有相同的約束。首先,它們必須有相同的長度。其次,兩個 `tuple` 間的每對元素(第一個對第一個,第二個對第二個,等等)必須支持同一個關系操作符。當這些約束被滿足時,`tuple` 的操作符才可以實現,它按順序比較每一對元素,即關系操作符是短路(short-circuited)的,一旦有了明確結果就馬上返回。操作符 `<`, `>`, `<=`, 和 `>=` 執行字典序的比較,并要求元素對執行同樣的操作。元素對的比較操作符產生的任何異常都會被傳播,但 `tuple` 操作符本身不拋出異常。
- 序
- 前言
- Acknowledgments
- 關于作者
- 本書的組織結構
- Boost的介紹
- 字符串及文本處理
- 數 據結構, 容器, 迭代器, 和算法
- 函數對象及高級編程
- 泛 型編程與模板元編程
- 數學及數字處理
- 輸入/輸出
- 雜項
- Part I: 通用庫
- Library 1. Smart_ptr
- Smart_ptr庫如何改進你的程序?
- 何時我們需要智能指針?
- Smart_ptr如何適應標準庫?
- scoped_ptr
- scoped_array
- shared_ptr
- shared_array
- intrusive_ptr
- weak_ptr
- Smart_ptr總結
- Library 2. Conversion
- Conversion 庫如何改進你的程序?
- polymorphic_cast
- polymorphic_downcast
- numeric_cast
- lexical_cast
- Conversion 總結
- Library 3. Utility
- Utility 庫如何改進你的程序?
- BOOST_STATIC_ASSERT
- checked_delete
- noncopyable
- addressof
- enable_if
- Utility 總結
- Library 4. Operators
- Operators庫如何改進你的程序?
- Operators
- 用法
- Operators 總結
- Library 5. Regex
- Regex庫如何改進你的程序?
- Regex 如何適用于標準庫?
- Regex
- 用法
- Regex 總結
- Part II: 容器及數據結構
- Library 6. Any
- Any 庫如何改進你的程序?
- Any 如何適用于標準庫?
- Any
- 用法
- Any 總結
- Library 7. Variant
- Variant 庫如何改進你的程序?
- Variant 如何適用于標準庫?
- Variant
- 用法
- Variant 總結
- Library 8. Tuple
- Tuple 庫如何改進你的程序?
- Tuple 庫如何適用于標準庫?
- Tuple
- 用法
- Tuple 總結
- Part III: 函數對象與高級編程
- Library 9. Bind
- Bind 庫如何改進你的程序?
- Bind 如何適用于標準庫?
- Bind
- 用法
- Bind 總結
- Library 10. Lambda
- Lambda 庫如何改進你的程序?
- Lambda 如何適用于標準庫?
- Lambda
- 用法
- Lambda 總結
- Library 11. Function
- Function 庫如何改進你的程序?
- Function 如何適用于標準庫?
- Function
- 用 法
- Function 總結
- Library 12. Signals
- Signals 庫如何改進你的程序?
- Signals 如何適用于標準庫?
- Signals
- 用法
- Signals 總結