Подтвердить что ты не робот

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

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

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)?

4b9b3361

Ответ 1

Можно использовать условный базовый класс:

struct BaseWithVariable    { int addedVariable; };
struct BaseWithoutVariable { };

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

Ответ 2

Во-первых, ваш код просто не будет компилироваться для MyClass<false>. Признак enable_if полезен для выведенных аргументов, а не для аргументов шаблона шаблона.

Во-вторых, здесь вы можете управлять членами:

template <bool> struct Members { };

template <> struct Members<true> { int x; };

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