一次启用许多 class 的成员字段,具体取决于模板 <T>
enable MANY class's member fields at once, depending on template <T>
这里是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修改自enable class's member depending on template,它一次只能启用一个字段。
(两个答案我都看了,但是它的第二个解决方案占用了太多内存。)
如何轻松切换多个字段on/off?
令人遗憾的是,这个 MCVE 很快就变得一团糟。
在我的真实案例中,我有大约 5-6 个不同类型的唯一字段。
为简单起见,cat3
、dog2
、...的类型不依赖于 T.
你可能有更简单的东西:
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;
这里是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修改自enable class's member depending on template,它一次只能启用一个字段。
(两个答案我都看了,但是它的第二个解决方案占用了太多内存。)
如何轻松切换多个字段on/off?
令人遗憾的是,这个 MCVE 很快就变得一团糟。
在我的真实案例中,我有大约 5-6 个不同类型的唯一字段。
为简单起见,cat3
、dog2
、...的类型不依赖于 T.
你可能有更简单的东西:
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;