Sto provando a scrivere un'applicazione che carica le sue estensioni in modo dinamico durante il runtime. Ho usato la libreria Boost Preprocessor per scrivere una funzione di preprocessore che, dato un elenco di nomi, dichiara una classe per ogni nome (e crea tutte sottoclassi di alcune classi di AbstractPlugin) e quindi dichiara una sequenza di MPL Boost contenente tali classi. Poi ho scritto una classe che prova un puntatore a AbstractPlugin se può essere lanciato su uno qualsiasi dei tipi in quella sequenza MPL. Il problema qui è che la mia funzione di preprocessore ha bisogno di un elenco completo di tutte le estensioni che voglio creare e caricare. C'è qualche tecnica che mi consente di registrare ciascuna estensione in un file separato?Registrare una classe C++ in modo che successivamente una funzione possa iterare su tutte le classi registrate
Aggiornamento:
credo, la mia spiegazione della situazione era troppo vago, così ho deciso di renderla più specifica.
Vorrei definire una raccolta di tipi di interno. Per ogni tipo di estensione potrebbe esserci un numero qualsiasi di estensioni. Durante il runtime il programma carica la libreria esterna, risolve la funzione del punto di ingresso, la chiama e, come risultato, ottiene un puntatore. Quindi cerca di trasmettere quel puntatore a tutti i tipi di estensione registrati (usando dynamic_cast
, quindi le classi per i tipi di estensione ereditano tutte da una classe di base polimorfa). Se un cast per un tipo di estensione ha esito positivo, il puntatore cast viene utilizzato in una chiamata al gestore speciale per quel tipo di estensione.
Il numero di tipi di estensione è noto al momento della compilazione (mentre, ovviamente, il numero di estensioni è infinito). Usando il mio aproach la classe loader usa questa conoscenza per verificare se esiste un gestore per ogni tipo di estensione (in caso contrario, il programma non viene compilato). Inoltre, il mio aproach non obbliga le classi per i tipi di estensione a sapere nulla del caricatore (quindi è facile modificare il loader). Ma sarebbe più comodo se ogni tipo di estensione fosse registrato da solo.
Sta generando un'intestazione una soluzione accettabile? – Arpegius