Зарегистрировать класс C++, чтобы позже функция могла перебирать все зарегистрированные классы.

Я пытаюсь написать приложение, которое динамически загружает свои расширения во время выполнения. Я использовал библиотеку Boost Preprocessor для написания функции препроцессора, которая, учитывая список имен, объявляет класс для каждого имени (и делает все их подклассами некоторого класса AbstractPlugin), а затем объявляет последовательность Boost MPL, содержащую эти классы. Затем я написал класс, который пробует указатель на AbstractPlugin, если его можно привести к любому из типов в этой последовательности MPL.Проблема здесь в том, что моей функции препроцессора нужен полный список всех расширений, которые я хочу создать и загрузить. Есть ли способ, который позволяет мне регистрировать каждое расширение в отдельном файле?

Обновление:

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

Я хотел бы определить набор типов расширений. Для каждого типа расширения может быть любое количество расширений. Во время выполнения программа загружает внешнюю библиотеку, разрешает функцию точки входа, вызывает ее и в результате получает указатель. Затем он пытается привести этот указатель ко всем зарегистрированным типам расширений (используя dynamic_cast, поэтому все классы для типов расширений наследуются от некоторого полиморфного базового класса). Если приведение к какому-либо типу расширения завершается успешно, приведенный указатель используется при вызове специального обработчика для этого типа расширения.

Количество типов расширений известно во время компиляции (в то время как, очевидно, количество расширений бесконечно). Используя мой подход, класс загрузчика использует эти знания, чтобы проверить, существует ли обработчик для каждого типа расширения (если нет, программа не компилируется). Кроме того, мой подход не требует, чтобы классы для типов расширений знали что-либо о загрузчике (поэтому легко изменить загрузчик). Но было бы удобнее, если бы каждый тип расширения регистрировался сам.

5
задан Brian Tompsett - 汤莱恩 27 June 2016 в 16:46
поделиться