Próbuję napisać aplikację, która ładuje swoje rozszerzenia dynamicznie w czasie wykonywania. Użyłem biblioteki Preprocessor Boost do napisania funkcji preprocesora, która, biorąc pod uwagę listę nazw, deklaruje klasę dla każdej nazwy (i tworzy wszystkie podklasy klasy AbstractPlugin), a następnie deklaruje sekwencję Boost MPL zawierającą te klasy. Następnie napisałem klasę, która próbuje użyć wskaźnika do AbstractPlugin, jeśli można go rzutować na dowolny typ w tej sekwencji MPL. Problem polega na tym, że moja funkcja preprocesora wymaga pełnej listy wszystkich rozszerzeń, które chcę utworzyć i załadować. Czy jest jakaś technika, która pozwala mi zarejestrować każde rozszerzenie w osobnym pliku?Zarejestruj klasę C++, aby później funkcja mogła wykonywać iteracje dla wszystkich zarejestrowanych klas.
Aktualizacja:
wierzę, moje wyjaśnienie sytuacji było zbyt niejasne, więc postanowiłem zrobić to dokładniej.
Chciałbym zdefiniować kolekcję typów rozszerzeń. Dla każdego typu rozszerzenia może istnieć dowolna liczba rozszerzeń. W czasie działania program ładuje bibliotekę zewnętrzną, rozpoznaje funkcję punktu wejścia, wywołuje ją, aw rezultacie otrzymuje wskaźnik. Następnie próbuje rzucić ten wskaźnik do wszystkich zarejestrowanych typów rozszerzeń (używając dynamic_cast
, więc klasy dla typów rozszerzeń dziedziczą z pewnej polimorficznej klasy bazowej). Jeśli rzut do jakiegoś typu rozszerzenia powiedzie się, rzutowany wskaźnik jest używany w wywołaniu specjalnego programu obsługi dla tego typu rozszerzenia.
Liczba typów rozszerzeń jest znana w czasie kompilacji (podczas gdy oczywiście liczba rozszerzeń jest nieskończona). Za pomocą mojego aproach klasa loader używa tej wiedzy do sprawdzenia, czy istnieje program obsługi dla każdego typu rozszerzenia (jeśli nie, program się nie kompiluje). Ponadto, moje podejście nie wymusza na klasach typów rozszerzeń żadnych informacji o ładowaczu (więc łatwo jest modyfikować program ładujący). Ale byłoby wygodniej, gdyby każdy typ rozszerzenia się zarejestrował.
Czy wygenerowanie nagłówka jest akceptowalnym rozwiązaniem? – Arpegius