2012-08-24 16 views
17

Considere el siguiente código:Agregar/Eliminar miembros de datos con parámetros de plantilla?

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

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

En este código, el parámetro de plantilla AddMembers permite agregar una función a la clase cuando es true. Para hacer eso, usamos un std::enable_if.

Mi pregunta es: ¿es lo mismo posible (tal vez con un truco) para la variable de miembros de datos? (En una forma tal que MyClass<false> tendrá miembro 1 de datos (myVariable) y MyClass<true> tendrá 2 miembros de datos (myVariable y addedVariable)

Respuesta

21

Una clase base condicional puede ser utilizado:?

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

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

En primer lugar, .. el código no se compilará para MyClass<false> El rasgo enable_if es útil para deducidas argumentos, no por argumentos de plantilla de clase

en segundo lugar, aquí es cómo se puede controlar a los miembros:

template <bool> struct Members { }; 

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

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

+++++ 1 perfecto! Mixin con parámetro de plantilla condicional – Viet

Cuestiones relacionadas