1

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

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

4

1 に答える 1

2

赤ちゃんの例として、次のようなものを想像できます-今のところ、1 つの固定型のタプルです。

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

data実際のソリューションには、もちろん、データ型の可変個引数テンプレート パラメーターがあり、最初の要素を使用して構築し、残りの要素を基本コンストラクターに渡す、可変個引数コンストラクターも提供します。

iこれでth 要素にアクセスしてみることができます:

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 = 0which が実際の要素を抽出する特殊化を行い、そこに到達するまで継承階層をキャストすることです。最後に、関数テンプレートを介してタプル型推定をスリングショットします。

template <int K, int N> T & get(MyTuple<N> & t)
{
    return get_impl<K>::get(t);
}
于 2012-01-26T23:26:28.540 に答える