C++ Boost

Tuple 庫高級特性

本文檔描述的高級特性全部在命名空間 ::boost::tuples 

Tuple 型別的元函數

T 是一個tuple型別, N 是一個整數常量表達式。

element<N, T>::type
此式給出tuple型別的第 N 個元素的型別如果 T 是一個常量,給出的也是一個常量型別。 應該注意 T 的常量性不會影響引用類型的元素。

length<T>::value
給出tuple型別 T 的長度。

部件鏈表

Tuple 在內部表示為部件(cons)的鏈表。例如,下面tuple

tuple<A, B, C, D>
從下面型別繼承
cons<A, cons<B, cons<C, cons<D, null_type> > > >
Tuple模板提供一個 typedef inherited 用於訪問部件鏈表(cons list)。例: tuple<A>::inherited 就是型別 cons<A, null_type>.

空的 tuple

空的tuple tuple<> 的內在表示是 null_type  。

首和尾

Tuple模板和cons模板都提供 typedefs head_typetail_type 。 這個head_type typedef給出tuple(或cons list)首元素的型別。這個 tail_type typedef 給出除去首元素的剩餘的cons list 。 首元素用成員變量head存儲,尾鏈表用成員變量tail表示。 部件鏈表(cons list)提供成員函數 get_head() 返回首元素的引用,和成員函數  get_tail() 返回尾cons list的引用。 兩個函數都有常量和非常量的版本。

注意,只有一個元素的tuple,tail_type 等於 null_type ,還有函數 get_tail() 返回 null_type型別的對象。

空的 tuple (null_type) 沒有首和尾,因此也沒有函數 get_headget_tail  。

把tuples看作為一個部件鏈表(cons list),就可以方便地定義泛型函數去操作tuple 。例如,下面的函數對每個tuple元素賦零值(明顯地,賦值操作符必須在每個元素類型中都有定義):

inline void set_to_zero(const null_type&) {};

template <class H, class T>
inline void set_to_zero(cons<H, T>& x) { x.get_head() = 0; set_to_zero(x.get_tail()); }

構造一個部件鏈表

一個 部件鏈表(cons list)可以默認構造的條件是其所有的元素都可默認地構造。

一個部件鏈表(cons list)可以從首到尾地被構造。構造函數的原型是:

cons(typename access_traits<head_type>::parameter_type h,
const tail_type& t)
這裡的 traits 模板應用在首元素的型別上,得到合適的用於參數傳遞的型別(對於引用型別,傳遞就是元素的型別,對於非引用型別,傳遞的是元素型別的非volatile的常量引用型別)。

對於只含一個元素的部件鏈表(cons list),尾參數 (null_type) 可以省略。

tuple元素型別的特性類型(Traits classes) 

access_traits

模板 access_traits 定義了三個型別函數。 給定tuple中一個元素的型別 T 有:

  1. access_traits<T>::non_const_typeT 映射為非常量函數(如非成員和成員的get函數和get_head函數)的返回類型。
  2. access_traits<T>::const_type 把 T 映射為常量函數的返回類型。
  3. access_traits<T>::parameter_typeT 映射為tuple構造函數的參數類型。

make_tuple_traits

用函數 make_tuple 構造tuple中的元素型別,是通過型別函數make_tuple_traits 計算出來的。型別函數調用 make_tuple_traits<T>::type 實現了如下型別映射: 引用包裝的對象通過ref或者cref函數構造 (參考 關於 make_tuple 函數)

引用包裝最初是tuple庫的一部分,如今已經是boost庫的一個通用的部件。 模板 reference_wrapperrefcref 函數在boost庫目錄的一個獨立的文件(ref.hpp)中定義;和直接在boost命名空間

返回到用戶指引

© Copyright Jaakko Järvi 2001.