Здесь 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.