J'ai la situation suivante: Supposons que j'ai un tas de types (foncteurs) que je souhaite enregistrer / compiler pendant la compilation, de préférence dans quelque chose comme Boost :: mpl :: vecteur. Connaissez-vous des astuces pour le faire bien?
Mon désir est d'avoir un fichier HPP qui implémente le type de foncteur et le fichier d'enregistrement, où une macro apporte de type dans la compilation. P>
par exemple P> Espérons que cela a du sens.
Merci p> p>
3 Réponses :
Je n'utiliserais pas les macros. La technique habituelle consiste à définir simplement un objet dont l'initialisation effectue l'enregistrement. Piecfall: Vous devez faire référence à quelque chose, par exemple. Appelez une fonction, dans l'unité de compilation, afin de l'avoir lié. P>
acclamations et hth., p>
Idéalement, j'aimerais mettre tous ces types dans des conteneurs avec une ligne. Je sais que je peux le faire autrement avec 2-3 lignes, mais je veux savoir s'il y a un tour.
Vous ne résoudrez jamais l'idée de mpl :: vecteur. Vous ne pouvez pas modifier les "variables". N'oubliez pas que le métaprogrammation de modèle est une langue fonctionnelle pure. Aucun effet secondaire du tout. P>
comme pour vous enregistrer ... La macro truc fonctionne bien. Définissez la macro de sorte qu'elle déclare et initialise une faible variable globale avec le processus d'enregistrement. Sinon, vous pouvez descendre la route que j'ai faite ici: p>
Comment forcer l'inclusion de "inutilisé "Définitions d'objet dans une bibliothèque p>
Notez le correctif si vous essayez de le faire dans une bibliothèque. P>
Mon idée était comme: Première inscription -> Type1, Ajoutez de la deuxième fois pour effectuer des types2, etc ... finaly TypeDef TypeN à Types.
MPL :: for_each code> vous donne des effets secondaires au moment de l'exécution. Vous pouvez probablement construire un mpl :: vecteur code> de types que vous pouvez faire quelque chose d'utile; une sorte de chaîne politique peut-être? Quoi qu'il en soit, les deux pour_each code> et la famille code> La famille vous permettent de construire des constructions pouvant avoir des effets d'exécution. Mon préféré est d'avoir un modèle de type CRS / CDR qui teste contre un MPL :: Contre-comportement et appelle un membre de la voiture ou élargit et appelle la voiture de CDR.
@YMG - Oui, mais il n'y a aucun moyen de construire une séquence MPL à partir de plusieurs emplacements indépendants. La seule chose que vous pouvez éventuellement faire est de définir une séquence quelque part et de l'utiliser. Donc, il n'y aurait pas de thème "Inscription". Ce ne serait pas plus efficace que de simplement sous-classer l'usine et de coder les types dans son constructeur. Moins tellement.
@Crazyeddie Eh bien, Quelqu'un a-t-il fait . Mais le STANDARD pense que cela devrait être mal formé a>.
Il y a un moyen d'enregistrer des types un par un, puis de les récupérer toutes sous la forme de mpl :: vecteur ou similaire. J'ai appris ce truc sur les listes de diffusion de Boost (peut-être de Dave Abrahams, bien que je ne puisse pas me rappeler à coup sûr).
Malheureusement, je ne trouve pas le fil d'origine à partir de laquelle j'ai appris l'astuce.
-1 b> Tout effet de modèle d'état étant susceptible d'être supprimé dans des normes ultérieures en tant que défaut de langue. Essentiellement ce que vous avez ici est un compteur de temps compilé (le nombre de types enregistrés). Même si cela fonctionne avec un compilateur particulier, il n'est pas raisonnable de s'attendre à ce que cela fonctionne avec d'autres.
@ Cheersandhth.-ALF Pourquoi pensez-vous? Ce que ce code fait réellement déclarer une nouvelle surcharge d'une fonction. Je ne vois aucun État modifié. Vous ne pouvez pas envisager d'ajouter une nouvelle surcharge comme modification d'un état, cela signifierait que tout programme possible est en train de noter un État. Code minimum à la raison de: wandbox.org/permlink/alpfkvqycmfeznog