c++ - 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 对象的列表很容易。
但我需要类功能。因此,如果可能的话,最好通过继承超类来制作可迭代的类列表,而无需手动将它们添加到模板中。
解决方案
也许以下内容对您来说已经足够了:
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();
推荐阅读
- ssis - 如何在 SSIS 中选择每月动态的不同源文件夹
- lua - 我的移动队列出了什么问题 为什么输入会重复?
- javascript - 如何使用带有 Hooks 的 react.js 提交多部分表单?
- delphi - setLength 改变 TBoundArray 的类型当 setLength(arr[i]
- python-3.x - 优化 2D numpy 数组创建循环
- php - symfony + phpunit - 如何使用 PasswordEncoder 依赖项测试 UserFactory
- python - python中位的循环移位(相当于Fortran的ISHFTC)
- vim - VIM:EOFError:读取行输入python时的EOF
- php - 如何通过 API 获取我的 PayPal 账户的交易历史
- gitlab - 从存储库的分支启动部署作业时,如何集中 Gitlab CI 部署/环境信息?