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();
С помощью объектов-методов составить список объектов static_casted легко.
Но мне нужны классы-функции. Таким образом, составить итеративный список классов, не добавляя их вручную в шаблон, в идеале, если возможно, наследуя суперкласс.
1 ответ
Может быть, вам достаточно следующего:
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();