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();
Другие вопросы по тегам