c++ templates c++11 metaprogramming enable-if

c++ - ¿Agregar/eliminar miembros de datos con parámetros de plantilla?



templates c++11 (2)

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

Segundo, así es como puedes controlar a los miembros:

template <bool> struct Members { }; template <> struct Members<true> { int x; }; template <bool B> struct Foo : Members<B> { double y; };

Considere el siguiente código:

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 (quizás con un truco) para los miembros de datos variable? (de tal manera que MyClass<false> tendrá 1 miembro de datos ( myVariable ) y MyClass<true> tendrá 2 miembros de datos ( myVariable y addedVariable )?


Se puede usar una clase base condicional:

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