C ++ самостоятельно добавляет статически-полиморфный класс в список подклассов constexpr - PullRequest
0 голосов
/ 07 мая 2018

У меня есть большое количество подклассов, которые подписываются на различные события, такие как инициализация и удаление объектов.

В настоящее время я решаю это, делая

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 Ответ

0 голосов
/ 07 мая 2018

Может быть, вам достаточно следующего:

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();
...