一次启用MANY类的成员字段,具体取决于模板<t>

时间:2019-02-25 11:16:07

标签: c++ templates c++17 enable-if

这里是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个不同类型的唯一字段。
为简单起见,cat3dog2,...的类型不依赖于T。

1 个答案:

答案 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;