Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 502
Vincent Avatar asked Aug 24 '12 23:08

Vincent


2 Answers

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. }; 
like image 199
James McNellis Avatar answered Oct 21 '22 00:10

James McNellis


First off, your code just won't compile for MyClass<false>. The enable_if trait is useful for deduced arguments, not for class template arguments.

Second, here's how you could control members:

template <bool> struct Members { };  template <> struct Members<true> { int x; };  template <bool B> struct Foo : Members<B> {     double y; }; 
like image 44
Kerrek SB Avatar answered Oct 21 '22 00:10

Kerrek SB