2012-01-26 8 views
1

優れたブーストタプルクラス(tuple_basic.hpp)のソースを掘り下げた後、再帰的なテンプレートアルゴリズムがタプルメンバーにアクセスするための 'get'メソッドで使用されていることがわかります。ブーストタプルの「取得」メソッドはどのように機能しますか?

数値テンプレートパラメータを特定のメンバ名にマップする方法があります。さらに、再帰テンプレート関数は常に最初の要素に収束しません(停止条件は次のとおりです)。再帰的なテンプレート関数、< 0>())?,どのようにゼロより大きい要素がアクセスされますか?

答えて

2

赤ちゃんの一例として、あなたはこのような何かを想像することができます - 今の一つの固定タイプのちょうどタプル:

template <int N> struct MyTuple : MyTuple<N - 1> 
{ 
    T data; 
}; 
template <> struct MyTuple<0> { }; 

実世界のソリューションを、もちろんデータ型の可変長引数テンプレートパラメータを持つことになり、また、可変のコンストラクタを提供し、最初の要素でdataを構築し、残りの要素を基本コンストラクタに渡します。

今、私たちはi番目の要素を試してみて、アクセスすることができます。

template <int K> struct get_impl 
{ 
    template <int N> static T & get(MyTuple<N> & t) 
    { 
     return get_impl<K - 1>::get(static_cast<MyTuple<N - 1>&>(t)); 
    } 
}; 
template <> struct get_impl<0> 
{ 
    template <int N> static T & get(MyTuple<N> & t) 
    { 
     return t.data; 
    } 
}; 

ここで重要なのは、K = 0実際の要素を抽出する際に専門を持つことである、とあなたがそこにいるまで継承階層をキャストします。最後に、関数テンプレートを使用してタプルタイプの控除をslingshotする:

+0

これは私が理解できないことですが、複数の値からなるタプルが再帰的テンプレートメソッドを使用してどのように処理されるのでしょうか? –

+0

@GearoidMurphy:多次元テンプレートパラメータをタプル定義に追加するだけです。 'get'の戻り値に' auto'/'decltype'を使って簡単にすることができます。 –

+0

可変テンプレートではありませんC++ x11?、ブーストタプルの実装はこの機能に依存しません。 –

関連する問題