首页 > 解决方案 > C++ 将静态多态类自动添加到子类的 constexpr 列表中

问题描述

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

目前我通过这样做来解决这个问题

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

使用 objects-methods,制作 static_casted 对象的列表很容易。
但我需要类功能。因此,如果可能的话,最好通过继承超类来制作可迭代的类列表,而无需手动将它们添加到模板中。

标签: c++templatesvariadic-templatesstatic-polymorphism

解决方案


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

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

推荐阅读