::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_traits
make_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. オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の 複製、利用、変更、販売そして配布を認める。このドキュメントは「あるがまま」 に提供されており、いかなる明示的、暗黙的保証も行わない。また、 いかなる目的に対しても、その利用が適していることを関知しない。