2012-12-26 162 views
6

我想了解下面的代碼。得到的是在T派生結構,什麼是「」裝置,然後回退{}C++模板和派生類

template <class T> 
struct has_FlowTraits<T, true> 
{ 
    struct Fallback { bool flow; }; 
    struct Derived : T, Fallback { }; //What does it means ? 

    template<typename C> 
    static char (&f(SameType<bool Fallback::*, &C::flow>*))[1]; 

    template<typename C> 
    static char (&f(...))[2]; 

public: 
    static bool const value = sizeof(f<Derived>(0)) == 2; 
}; 
+0

'Derived'是一個'struct',它有兩個基類:'T'和'Fallback'。 – Mankarse

回答

6

它是Member Detector Idiom的實現。它使用SFINAE來檢查類型T是否有名爲flow的成員。

編輯:你問的逗號部分是multiple inheritance。 Derived的結構是(公開)從繼承而來,兩者都是 T和Fallback。

+0

-1:並沒有真正回答OP的問題,他有一個**語法的誤解**,並詢問要解釋。 –

+0

我意識到和編輯。 – jrok

+0

oki :-)我刪除我downvote –

2

這只是多重繼承。以下是從T衍生的Derived(並且不提供進一步的定義):

struct Derived : T { }; 

而下面是從兩個TFallback衍生的Derived

struct Derived : T, Fallback { }; 

即, Derived將繼承T的成員Fallback的成員。在這種情況下,由於Derived是一個結構體,繼承是默認公有繼承

1

逗號表示它從公開或私有派生(取決於T還是Fallback是一個結構或類)。逗號僅包括那些類別,其中Derive將從中派生出來。

+0

感謝您的解釋。 – user1768610

1

這意味着:

has_FlowTraits struct的定義裏面,你也可以定義一個新的struct被稱爲Derived

你說這個結構Derived是繼承類型T和類型Fallback。 (如果您之前查看該行,則剛定義了struct Fallback)。

{}只是意味着沒有更多的實施細節。此類型不需要更多的方法或屬性定義。

+0

感謝您的解釋。 – user1768610

+0

:-)歡迎來到SO! –

+0

Stephane,當我嘗試使用aix xlc 12.1進行編譯時,出現以下錯誤。 「YAMLTraits.h」,第264行。20:1540-0118(S)在基本說明符中需要類名。第264行是「struct Derived:T,Fallback {};」。任何想法可能是什麼原因? – user1768610