2012-06-25 58 views
4

我從我的朋友那裏得到了一段代碼。但我真的很困惑,一個結構怎麼能從它自身繼承?繼承是否有意義?一個結構繼承自己

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

template<> 
struct Field<TypeListEnd> { 
}; 

我不知道這裏發生了什麼事。

+2

讓我們清楚,一個結構不能繼承自身,因爲它會遞歸_ad infinitum_。但這不是你的代碼中發生的事情。 –

+3

@jweyrich這不是CRTP;那會是'struct Field:SomeTemplate '。這只是C++ 03類型列表模板元編程。 – ecatmur

+0

@ecatmur:true!剛剛刪除了我的錯誤評論。 – jweyrich

回答

8

Field不從自身繼承;相反,template<typename TYPELIST> Field繼承自Field<typename TYPELIST::Tail>。只要這兩個模板參數列表是不同的就可以了。

類型列表是一種陳舊的方法,允許模板(實際上)在將variadic templates添加到該語言之前獲取可變數量的類型參數。他們實現了一個簡單的單鏈表結構,相當於LISP cons單元,其中Head是「有效載荷」類型,其他列表是,它可以是類型列表或TypeListEnd類型,相當於LISP nil

假設我們有

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

在這裏,我假設TypeList是分別對應於它的第一個和第二個模板參數定義HeadTail的typedef成員模板:

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

注意,我因爲這可能必須在C++ 03編譯器上編譯,所以在模板上下文中,>>總是偶數解釋爲鑽井平臺ht移位運算符。

然後你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做任何有用的事情都是另一回事,只是作爲讀者的練習。

2

當你有一個類模板template <typename X> class SomeTemplate,然後類類型SomeTemplate<A>SomeTemplate<B>是兩個完全不同的,不相關的類類型(假設AB是不同的)。由於它們是兩種完全不同的類型,因此它們之中的一個從另一個繼承。 SomeTemplate<A>可以從SomeTemplate<B>繼承,它繼而可以繼承自SomeTemplate<C>等等,只要它在某個時刻不會變成自引用。

換句話說,在您的示例中,struct不像您認爲的那樣繼承自身。在你的例子中根本沒有struct。相反,你的例子有幾個模板對於struct s。這些模板當且僅當它們是專用的時,即當所有模板參數被實際類型替換時都變爲struct。由於繼承,該專業化可能會變成合法或非法取決於額外的細節(你沒有提供)。