Modèle de Méta-programmation avec des Tableaux de Char en tant que Paramètres
Je suis en train de jouer autour avec TMP dans GCC 4.3.2 de la moitié-de la mise en œuvre de C++11, et je me demandais si il y avait un moyen de faire en quelque sorte effectuer les opérations suivantes:
template <char x, char... c>
struct mystruct {
...
};
int main () {
mystruct<"asdf">::go();
}
Il est évident qu'elle ne me laisse pas faire comme ça, et je pensais avoir de la chance en utilisant définis par l'utilisateur littéraux à transformer les "asdf" chaîne lors de la compilation, mais GCC 4.3 ne prend pas en charge définis par l'utilisateur littéraux...
Des suggestions? Je préfère ne pas faire 'a','s','d','f', car cela entrave fortement mes plans pour ce projet.
OriginalL'auteur Daniel Jennings | 2009-04-02
Vous devez vous connecter pour publier un commentaire.
Malheureusement, vous avez encore de le découper en plusieurs caractères, par exemple:
À mon humble avis, c'est une énorme surveillance dans la nouvelle norme. Quelques autres personnes sont d'accord, et a essayé de mettre en œuvre le comportement de GCC avec d'assez bons résultats. Vous pouvez trouver ce thread ici.
Edit: Certains des problèmes bizarres avec le lien, pour couper et coller à partir de ce:
http://groups.google.com/group/comp.lang.c++.modéré/browse_thread/thread/9b0edd169ba2ce3c
Apparemment, il est possible de faire quelque chose comme: myTemplate<_S("ma chaîne arbitraire")>, où _S est une macro qui génère une mpl chaîne. Il est prédéfini max longueur de chaîne qui est configurable. Voir la discussion ici: cpp-next.com/archive/2012/10/...
OriginalL'auteur Dan Olson
J'ai résolu un problème similaire. Nous avons besoin d'un type différent pour chaque nom
Cela vous a donné le temps de compilation d'accès au nom et unique de l'instanciation. Il ne sera cependant pas vous permettre d'accéder aux caractères individuels au moment de l'exécution.
Si vous voulez caractère individuel d'accès, la seule façon de l'atteindre est avec un définis par l'utilisateur littérale. C++0x être étendu pour permettre la syntaxe dans votre fonction principale ci-dessus, mais il sera toujours lier le modèle à un pointeur de caractère pas à un moment de la compilation tableau de caractères.
template< const char* the_name >
est illégal c++.Fonctionne très bien pour moi ideone.com/Dj2Po.
OriginalL'auteur deft_code
Essayez ceci:
Chris
OriginalL'auteur
Un "chaîne" a été récemment ajouté à Boost.MPL, ce qui permet d'écrire:
Noter que l'exemple montré ci-dessus est un peu tiré par les cheveux, comme des "chaînes" de plus de 4 caractères doivent être séparés. Par exemple:
OriginalL'auteur Éric Malenfant
En C++11 il n'existe aucun moyen pour le stockage temporaire de la chaîne de n'importe où au moment de la compilation. Donc, je peux vous suggérer cette approche:
(C'est vite-fait des croquis, mais il est bien descriptif)
Bash code pour générer une partie de la macro:
Vous devez passer un grand nombre (plus de 1000) pour ce générateur pour toutes vos chaînes et vous devez le rendre statique affirmation si la chaîne dépasse cette limite.
- Je utiliser ces généré des macros dans mes propres projets scientifiques. Je sais que cela semble désordonné, mais il fonctionne. Exemple d'utilisation de la macro générée:
Je vais essayer de trouver plus jolie solution, mais d'abord je vais utiliser cette.
OriginalL'auteur cppist
Je ne suis pas sûr de ce que vous voulez atteindre, mais quand vous passez "asdf" pour le modèle, il est de type char * et la valeur est l'adresse de la chaîne. Ainsi, une approche simple comme celle présentée échouera. Il est difficile de recommander quoi que ce soit sans savoir ce que le problème que vous essayez de résoudre en premier lieu.
OriginalL'auteur lothar
Vous ne pouvez pas le faire. De 14.3.2 dans la norme:
Un modèle d'argument pour un non-type, non-template template-parameter est l'un des:
mais à l'exclusion des non-statique des membres de la classe, exprimé sous la forme & id-expression où le & est facultatif si le nom fait référence à
C'est ce que je veux dire définies par l'utilisateur avec des littéraux: stackoverflow.com/questions/537303/binary-literals/...
Wow, merci pour ce lien. J'ai eu envie de quelque chose comme constexpr pendant un certain temps.
OriginalL'auteur CTT
Citation de nouveau projet de norme:
Exemple:
Essayer, mais je ne suis pas sûr, parce que http://gcc.gnu.org/gcc-4.3/cxx0x_status.html ne dit pas tout sur cette fonctionnalité.
OriginalL'auteur bayda
Motti est faux.
Malheureusement actuelle de la norme C++11) ne supporte pas variadic template littérale de l'opérateur pour les paramètres de chaîne, il est possible que pour les numéros.
Je n'ai pas compris le but de cette restriction.
OriginalL'auteur cppist
Voir la discussion ici, apparemment c'est possible: http://cpp-next.com/archive/2012/10/using-strings-in-c-template-metaprograms/
OriginalL'auteur Buğra Gedik