基于标志的多重继承

Bor*_*rov 4 c++ metaprogramming template-meta-programming

我有几类,比如说A,BC,和相应的标志HAS_A=1,HAS_B=2HAS_C=4.是否有可能写一个类以这样的方式,其父母(由A,BC)将通过这些标志的组合决定的?

例:

ParentsFromFlags<HAS_A | HAS_C> x;
// x ends up having the features of A and C
Run Code Online (Sandbox Code Playgroud)

我知道我可以有多个可变的父母<typename... Parents>,但我想这是因为我要确保,如果A,BC是类的父母,他们总是会出现一定的顺序.

mar*_*rom 7

这样做的代价是以在层级中引入一些额外的课程为代价......

enum ParentFlags { HAS_A = 1, HAS_B = 2, HAS_C = 4 };

class A{};
class B{};
class C{};

template <int M>
class ParentClass {};

template <>
class ParentClass<0>{};

template <>
class ParentClass<HAS_A> : public A {};

template <>
class ParentClass<HAS_B> : public B{};

template <>
class ParentClass<HAS_C> : public C{};

template <int F, int M>
class ParentTraits : public ParentClass<F & M>, 
                     public ParentTraits<F & ~M, M << 1>
{};

template <int M>
class ParentTraits<0, M>
{};

template <int F>
class ParentFromFlags : public ParentTraits<F, 1>
{
};

int main()
{
    ParentFromFlags<HAS_A | HAS_B> ab;
    ParentFromFlags<HAS_A | HAS_C> ac;
    ParentFromFlags<HAS_A | HAS_B | HAS_C> abc;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)