这里是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)
}
以上enable class's member depending on template中修改的上述不雅MCVE一次只能启用一个字段。
(我读了两个答案,但是第二个解决方案使用了太多的内存。)
如何轻松切换多个字段?
令人遗憾的是,这个MCVE很快变得一团糟。
在我的实际情况下,我大约有5-6个不同类型的唯一字段。
为简单起见,cat3
,dog2
,...的类型不依赖于T。
答案 0 :(得分:4)
您可能会更简单一些:
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;