Salut,
En fait, voici le concept.
- On a une interface Item dont on fait dériver Apple
- On crée, via une macro, une instance de ItemMetaClass qui va stocker "Apple" en nom de metaclass et Apple::Create() en tant que fonction de création d'Item. La metaclasse s'enregistre dans un conteneur de toutes les metaclasses connues au sein de son contructeur
- En lisant un fichier ASCII de config dans lequel j'ai les noms des items, je récupère dans le conteneur la metaclasse adéquate (par le nom) et j'en extraie la fonction qui me permet d'instancier un Item
Le problème est que, si je ne fais jamais explicitement appel à la metaclass créée pour Apple, elle sera dead code strippée. Or, je ne l'appelle jamais dans ma lib, et du côté du client je ne peux rien garantir.
J'ai trouvé une manière cradissime de faire, mais je ne suis pas satisfait avec ca:
#pragma comment(linker, "/INCLUDE:?Class@CApple@@2VCItemMetaClass@MyNameSpace@@A")
En incluant ce pragma dans le header, on force le symbole correspondant au nom décoré à faire partie du link. Le seul truc, c'est que cette syntaxe doit être extrêmement dépendante du compileur et pas du tout cross-plateforme. De plus elle suppose de connaitre lel nom décoré de la métaclasse, ce qui n'est pas évident.
Donc, si tu as d'autres idées, je suis preneur. Merci.[/list]
Partager