включить МНОГИЕ поля-члены класса сразу, в зависимости от шаблона <T> - PullRequest
0 голосов
/ 25 февраля 2019

Здесь MCVE .Это работает: -

template<bool c3> class Has3 { };
template<> class Has3<true> { public: int cat3; };

template<bool c2,bool c3> class Has2 : public Has3<c3>{ };
template<bool c3> struct Has2<true,c3> : public Has3<c3>{ public: int dog2; };

template<bool c1,bool c2,bool c3> class Has1 : public Has2<c2,c3>{ };
template<bool c2,bool c3> struct Has1<true,c2,c3> : 
     public Has2<c2,c3>{public:  int rat1; }; //<- ugly, in my opinion.

int main(){
    Has1<false,true,false> h; 
    h.dog2=5;
    //h.cat3=4;  //<- compile error (which is good)
}

Вышеупомянутый не элегантный MCVE изменен с включить члена класса в зависимости от шаблона , который может включать только одно поле за раз.
(я читал обаответы, но его второе решение использует слишком много памяти.)

Как легко включать / выключать многие поля?
Печально, что этот MCVE довольно быстро становится беспорядочным.

В моих реальных случаях у меня есть около 5-6 уникальных полей разных типов.
Для простоты тип cat3, dog2, ... не зависит от T.

1 Ответ

0 голосов
/ 25 февраля 2019

У вас может быть что-то попроще:

class Cat  { public: int cat3; };
struct Dog { public: int dog2; };
struct Rat { public: int rat1; };

template <typename... Bases>
class Group : public Bases... {};

А потом

Group<Dog, Rat> h;

h.dog2=5;
...