C ++自我添加静态多态类到constexpr子类列表

时间:2018-05-06 23:08:34

标签: c++ templates variadic-templates static-polymorphism

我有大量的子类订阅了各种事件,例如初始化和实体删除。

目前我通过

来解决这个问题
class A{ static void init(); void kill(ID); }
class B{ static void init(); void kill(ID); }
class C{ static void init(); void kill(ID); }
A::init();
B::init();
C::init();

其中,使用多行编辑器并不困难,并且阅读起来很简单,但是存在很多错误的空间,大多数都记得将每个新类添加到调用部分,而不是类像动态多态一样添加自己。

如何使用静态多态来将其转换为类似于

的形式
//interface, with default behavior implementation
class W{ static void init(){...} void kill(ID){...} }

class A : W<A> {}
class B : W<B> { static void init(){...} }

constexpr auto w_classes = magic_classlist(A, B, ...)

w_classes::init();

使用对象方法,可以轻松制作一个static_casted对象列表 但我需要类功能。所以要创建一个可迭代的类列表,而不是手动将它们添加到模板中,理想情况下通过继承超类,如果可能的话。

1 个答案:

答案 0 :(得分:1)

也许以下内容对您来说已经足够了:

template <typename ... Ts>
class magic_classlist
{
    static void init()
    {
        (Ts::init(), ...); // C++17, but can be done for C++11
    }
};

然后:

constexpr auto w_classes = magic_classlist<A, B, ...>();

w_classes::init();