Добавить / удалить элементы данных с параметрами шаблона?

Рассмотрим следующий код:

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;
};
Другие вопросы по тегам