C++ 将静态多态 class 自添加到 subclasses 的 constexpr 列表

C++ self-adding a static-polymorphic class to a constexpr list of subclasses

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

目前我通过

解决这个问题
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();

其中,使用多行编辑器并不困难,而且阅读起来很简单,但是有很多错误的空间,主要是记住将每个新的 class 添加到调用部分,而不是 class 像使用动态多态一样添加自身。

如何使用静态多态将其变成类似于

的形式
//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 个对象的列表很容易。
但我需要 classes 函数。因此,要制作一个 classes 的可迭代列表,而无需手动将它们添加到模板中,最好是通过继承 superclass,如果可能的话。

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

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();