C++ C++;将静态多态类自添加到子类的constexpr列表

C++ C++;将静态多态类自添加到子类的constexpr列表,c++,templates,variadic-templates,static-polymorphism,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(); 使用多行编辑器并不困难,阅读起来也很简单,但是有很多错误的空间,主要是记住

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

目前我通过以下方法解决此问题:

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();
//接口,带有默认行为实现
类W{static void init(){…}void kill(ID){…}
A类:W{}
类B:W{static void init(){…}
constexpr auto w_classes=magic_classlist(A,B,…)
w_类::init();
使用objects方法,创建静态对象列表很容易。

但是我需要类和函数。因此,如果可能的话,在不手动将类添加到模板的情况下,最好通过继承超类来创建一个可编辑的类列表。

也许以下内容就足够了:

template <typename ... Ts>
class magic_classlist
{
    static void init()
    {
        (Ts::init(), ...); // C++17, but can be done for C++11
    }
};
模板
类列表
{
静态void init()
{
(Ts::init(),…);//C++17,但可以为C++11完成
}
};
然后:

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

w_classes::init();
constexpr auto w_classes=magic_classlist();
w_类::init();

历史上,这是通过工厂设计模式解决的,请参阅以不需要手动添加类的方式重写此代码最终会导致更大、更困难的问题—确定哪些类是自添加的。消除重复的init/kill代码很容易——只需保留一个类的元组(或其他类型的列表)并为每个类调用一个方法。这里的区别是我想在编译时这样做,而不是virtualsI尝试使用宏将lambda应用于令牌的可变列表,但可变宏语法是令人望而却步的神秘,所以我决定这样做。我仍然需要显式初始化静态成员,这很烦人,但我想这就是这种方法的代价。