6

友達からコードをもらいました。しかし、私は本当に混乱しています。構造体はどのようにしてそれ自体から継承できますか?継承は非常に意味がありますか?

template<class TYPELIST>
struct Field : public Field<typename TYPELIST::Tail> {
  typedef TYPELIST TypeListType;
  typename TypeListType::Head item_;
};

template<>
struct Field<TypeListEnd> {
};

ここで何が起こっているのかわかりません。

4

2 に答える 2

10

Fieldそれ自体から継承しません。むしろ、template<typename TYPELIST> Fieldから継承しField<typename TYPELIST::Tail>ます。テンプレート引数の2つのリストが異なる限り、問題ありません。

タイプリストは、可変個引数テンプレートが言語に追加される前に、テンプレートが(事実上)可変数の型引数を取ることを可能にする古風な方法でした。彼らは、LISP consセルに相当する単純な単一リンクリスト構造を実装しました。ここHeadで、は「ペイロード」タイプであり、リストの残りの部分はタイプリストまたはLISPに相当するタイプTailのいずれかです。TypeListEndnil

私たちが持っていると仮定します

typename TypeList<int, TypeList<char, TypeList<float, TypeListEnd> > > MyTypeList;

ここでは、それがそれぞれ1番目と2番目のテンプレートパラメーターに対応するTypeListテンプレート定義メンバーHeadとtypedefメンバーであると想定しています。Tail

template<typename Head, Tail> struct TypeList { typedef Head Head; typedef Tail Tail; };

閉じ角かっこはスペースで区切る必要があることに注意してください。これは、C ++ 03コンパイラでコンパイルする必要がある場合があるためです。これは>>、テンプレートコンテキストでも常に右シフト演算子として解釈されます。

次に、Fieldメタ関数がで呼び出されるとMyTypeList、に展開されます

Field<MyTypeList>;

Field<typename TypeList<int, TypeList<char, TypeList<float, TypeListEnd> > > >;

struct Field<...>: TypeList<int, TypeList<char, TypeList<float, TypeListEnd> > >::Tail {
    TypeList<int, TypeList<char, TypeList<float, TypeListEnd> > >::Head item;
};

struct Field<...>: TypeList<char, TypeList<float, TypeListEnd> > {
    int item;
};

...

struct Field<...>: struct Field<...>: struct Field<...>: struct Field<TypeListEnd> {
} {
    float item;
} {
    char item;
} {
    int item;
};

これによりstruct、タイプリスト内のすべてのタイプがパブリック継承によって含まれるようになります。もちろん、そのようなもので何か役に立つことをすることstructは別の問題であり、読者のための練習として残されています。

于 2012-06-25T01:05:31.280 に答える
2

クラステンプレートがある場合template <typename X> class SomeTemplate、クラスタイプSomeTemplate<A>SomeTemplate<B>は2つの完全に異なる、無関係のクラスタイプです(ABが異なると仮定します)。2つの完全に異なるタイプであるため、一方が他方から継承することに問題はありません。SomeTemplate<A>は、から継承できます。これは、ある時点で自己参照にならない限り、SomeTemplate<B>から継承できます。SomeTemplate<C>

言い換えれば、あなたの例でstructは、あなたが信じているように、それ自体から継承していません。structあなたの例にはまったくありません。代わりに、例にはsのテンプレートがいくつかあり ますstruct。これらのテンプレートは、特殊化されている場合、つまりすべてのテンプレート引数が実際の型に置き換えられているstruct場合にのみsになります。継承のため、その専門分野は、追加の詳細(提供しなかった)に応じて合法または違法になる可能性があります。

于 2012-06-25T01:31:58.317 に答える