Добавить / удалить элементы данных с параметрами шаблона?
Рассмотрим следующий код:
template<bool AddMembers> class MyClass
{
public:
void myFunction();
template<class = typename std::enable_if<AddMembers>::type> void addedFunction();
protected:
double myVariable;
/* SOMETHING */ addedVariable;
};
В этом коде параметр шаблона AddMembers
разрешить добавить функцию в класс, когда это true
, Для этого мы используем std::enable_if
,
Мой вопрос: возможно ли то же самое (возможно, с помощью хитрости) для переменных членов данных? (таким образом, что MyClass<false>
будет иметь 1 элемент данных (myVariable
) а также MyClass<true>
будет иметь 2 члена данных (myVariable
а также addedVariable
)
2 ответа
Решение
Можно использовать условный базовый класс:
struct BaseWithVariable { int addedVariable; };
struct BaseWithoutVariable { };
template <bool AddMembers> class MyClass
: std::conditional<AddMembers, BaseWithVariable, BaseWithoutVariable>::type
{
// etc.
};
Во-первых, ваш код просто не будет компилироваться для MyClass<false>
, enable_if
Черта полезна для выводимых аргументов, а не для аргументов шаблона класса.
Во-вторых, вот как вы можете контролировать участников:
template <bool> struct Members { };
template <> struct Members<true> { int x; };
template <bool B> struct Foo : Members<B>
{
double y;
};