12
votes

Enregistrement de type C ++ au tour de la compilation

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.

par exemple XXX

Espérons que cela a du sens. Merci


0 commentaires

3 Réponses :


0
votes

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é.

acclamations et hth.,


1 commentaires

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.



-4
votes

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.

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:

Comment forcer l'inclusion de "inutilisé "Définitions d'objet dans une bibliothèque

Notez le correctif si vous essayez de le faire dans une bibliothèque.


4 commentaires

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 vous donne des effets secondaires au moment de l'exécution. Vous pouvez probablement construire un mpl :: vecteur 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 et la famille 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é .



24
votes

3 commentaires

Malheureusement, je ne trouve pas le fil d'origine à partir de laquelle j'ai appris l'astuce.


-1 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