2012-08-24 6 views
17

Betrachten Sie den folgenden Code ein:Hinzufügen/Entfernen von Datenelementen mit Vorlagenparametern?

template<bool AddMembers> class MyClass 
{ 
    public: 
     void myFunction(); 
     template<class = typename std::enable_if<AddMembers>::type> void addedFunction(); 

    protected: 
     double myVariable; 
     /* SOMETHING */ addedVariable; 
}; 

In diesem Code ist der Template-Parameter AddMembers ermöglichen, eine Funktion zur Klasse hinzuzufügen, wenn es true ist. Um dies zu tun, verwenden wir eine std::enable_if.

Meine Frage ist: ist das gleiche möglich (vielleicht mit einem Trick) für Datenelemente Variable? (In einer solchen Art und Weise, dass MyClass<false> wird 1-Datenelement haben (myVariable) und MyClass<true> werden 2 Datenelemente haben (myVariable und addedVariable)

Antwort

21

Eine bedingte Basisklasse verwendet werden können:

struct BaseWithVariable { int addedVariable; }; 
struct BaseWithoutVariable { }; 

template <bool AddMembers> class MyClass 
    : std::conditional<AddMembers, BaseWithVariable, BaseWithoutVariable>::type 
{ 
    // etc. 
}; 
16

Zunächst einmal, .. Ihr Code wird nicht nur für MyClass<false> kompiliert Das enable_if Merkmal für abgeleitet Argumente, nicht für Klassenvorlage Argumente

Zweiter nützlich ist, ist hier, wie Sie Mitglieder kontrollieren können:

template <bool> struct Members { }; 

template <> struct Members<true> { int x; }; 

template <bool B> struct Foo : Members<B> 
{ 
    double y; 
}; 
+0

+++++ 1 perfekt! Mixin mit bedingten Template-Parametern – Viet