2012-12-26 22 views
6

Sto cercando di capire il seguente codice. Derivata è una struttura derivata da T e che cosa "" mezzi e quindi Fallback {}Modelli C++ e classi derivate

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

'Derivato' è una' struct' che ha due classi base: 'T' e' Fallback'. – Mankarse

risposta

6

Si tratta di un'implementazione di Member Detector Idiom. Utilizza SFINAE per verificare se il tipo T ha un membro chiamato flow.

Modifica: la parte virgola che stai chiedendo è multiple inheritance. Struct Derived eredita (pubblicamente) da sia T che Fallback.

+0

-1: in realtà non risponde alla domanda OP, ha un ** sintomo di incomprensione ** e chiede di spiegarlo. –

+0

L'ho capito e modificato. – jrok

+0

oki :-) rimuovo il mio downvote –

2

È solo un'eredità multipla. Quanto segue è un Derived derivato da T (e non fornisce alcuna ulteriore definizione):

struct Derived : T { }; 

E il seguente è un Derived derivato da entrambi T e Fallback:

struct Derived : T, Fallback { }; 

Cioè, Derived erediterà i membri di Te i membri di Fallback. In questo caso, poiché Derived è una struttura, l'ereditarietà è l'ereditarietà predefinita .

1

La virgola significa che deriva sia pubblicamente che privatamente (a seconda che lo T o Fallback sia una struttura o una classe) di quelle due classi. La virgola include semplicemente quelle classi come quelle da cui deriverà Derive.

+0

Grazie per la spiegazione. – user1768610

1

Significa:

all'interno della definizione di has_FlowTraits struct, si definisce anche un nuovo struct che si chiama Derived.

Si dice che questa struttura Derived eredita il tipo T e il tipo Fallback. (Se si guarda prima la riga, è stato appena definito lo struct Fallback).

il {} significa semplicemente che non ci sono ulteriori dettagli di implementazione. Non è necessario più un metodo o una definizione di attributo per questo tipo che sia utile.

+0

Grazie per la spiegazione. – user1768610

+0

:-) Benvenuti su SO! –

+0

Stephane, Quando provo a compilare usando aix xlc 12.1, ottengo il seguente errore. "YAMLTraits.h", riga 264.20: 1540-0118 (S) È previsto un nome classe nello specificatore di base. la riga 264 è "struct Derived: T, Fallback {};". Qualche idea su quale potrebbe essere la ragione? – user1768610

Problemi correlati