::boost::tuplesにある。
Tはタプル型であり、Nは汎整数定数式であるとする。
これはタプル型element<N, T>::type
TのN番目の要素の型となる。
length<T>::value
これはタプル型Tの要素数となる。
タプルは内部的にはconsリストとして表現されている。
例えば、タプル
は、型
tuple<A, B, C, D>
を継承している。
タプル テンプレートは、consリストにアクセスするため、typedef名cons<A, cons<B, cons<C, cons<D, null_type> > > >
inheritedを提供している。例えば:
tuple<A>::inheritedは型cons<A, null_type>である。
空タプルtuple<>の内部表現はnull_typeである。
タプル テンプレートとconsテンプレートのどちらも、typedef名head_typeとtail_typeを提供している。
head_typeは、タプル(またはconsリスト)の最初の要素の型となる。
tail_typeは、最初の要素を除いたconsリストの残りの部分となる。
最初の要素は、メンバ変数headに格納されており、tailリストはメンバ変数tailにある。
consリストは、そのheadへの参照を得るためにメンバ関数get_head()を、またtailへの参照を得るためにメンバ関数get_tail()を提供している。
どちらの関数にも、constおよび非constのバージョンがある。
1要素のタプルにおいては、tail_typeはnull_typeと等しく、get_tail()関数はnull_typeのオブジェクトを返す。
空タプル(null_type)にはheadもtailも無い。だからget_headおよびget_tail関数は提供されない。
タプルをconsリストとして扱うと、タプルを操作するためのジェネリックな関数を定義するのが楽になる。例えば、次の二つの関数テンプレートは、タプルのそれぞれの要素に0を代入する(もちろん、要素型にとって代入は正当な操作でなければならない):
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リストは、もし全ての要素がデフォルト コンストラクト可能であれば、デフォルト コンストラクト可能である。
consリストは、headおよびtailから構築可能である。コンストラクタのプロトタイプは:
cons(typename access_traits<head_type>::parameter_type h,
const tail_type& t)
headパラメータの特性テンプレートは、任意の要素型に対して、適切なパラメータ型を選択する(参照型の要素では、パラメータ型は要素型と同じ、非参照型では、パラメータ型はconst非volatileへの参照となる)。
1要素のconsリストでは、tail引数(null_type)は省略してよい。
access_traits
テンプレートaccess_traitsは3つの型関数を定義する。Tがあるタプルの要素型であるとしよう。
access_traits<T>::typeは、非constのアクセス関数(非メンバおよびメンバのget関数、get_head関数)の返却値型になる。access_traits<T>::const_typeは、constのアクセス関数の返却値型になる。access_traits<T>::parameter_typeは、タプルのコンストラクタのパラメータ型になる。make_tuple_traitsmake_tuple関数によって生成されるタプルの要素型は、型関数make_tuple_traitsにより求められる。型関数呼び出しmake_tuple_traits<T>::typeは、次のように型を対応付ける:
reference_wrapper<T> -> T&
T -> T
reference_wrapperのオブジェクトは、refまたはcref関数によって生成されるものである(make_tuple関数を参照されたい)。
参照ラッパはそもそもはtuple libraryの一部であったが、今やboostの汎用的なユーティリティとなった。
reference_wrapperテンプレートとrefおよびcref関数は、主boostインクルードディレクトリにある別のファイルref.hppにおいて、直接boost名前空間に定義されている。
© Copyright Jaakko Järvi 2001.
Japanese Translation Copyright (C) 2003 Yoshinori Tagawa. オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の 複製、利用、変更、販売そして配布を認める。このドキュメントは「あるがまま」 に提供されており、いかなる明示的、暗黙的保証も行わない。また、 いかなる目的に対しても、その利用が適していることを関知しない。