Search code examples
c++templatesc++11metaprogrammingenable-if

Add/Remove data members with template parameters?


Consider the following code :

template<bool AddMembers> class MyClass
{
    public:
        void myFunction();
        template<class = typename std::enable_if<AddMembers>::type> void addedFunction();

    protected:
        double myVariable;
        /* SOMETHING */ addedVariable;
};

In this code, the template parameter AddMembers allow to add a function to the class when it's true. To do that, we use an std::enable_if.

My question is : is the same possible (maybe with a trick) for data members variable ? (in a such way that MyClass<false> will have 1 data member (myVariable) and MyClass<true> will have 2 data members (myVariable and addedVariable) ?


Solution

  • A conditional base class may be used:

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