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();
我有大量的子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();