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.
};