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