Bor*_*rov 4 c++ metaprogramming template-meta-programming
我有几类,比如说A,B和C,和相应的标志HAS_A=1,HAS_B=2和HAS_C=4.是否有可能写一个类以这样的方式,其父母(由A,B和C)将通过这些标志的组合决定的?
例:
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,B和C是类的父母,他们总是会出现一定的顺序.
这样做的代价是以在层级中引入一些额外的课程为代价......
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)