Hello,
Est-il possible de faire un typedef templatisé pouer quelque quelque chose comme ça ?
Merci.
Code : Sélectionner tout - Visualiser dans une fenêtre à part T* (*)(const char *)
Hello,
Est-il possible de faire un typedef templatisé pouer quelque quelque chose comme ça ?
Merci.
Code : Sélectionner tout - Visualiser dans une fenêtre à part T* (*)(const char *)
Puis ensuite:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 template<class T> struct MaMethodeTrait { typedef T* (*MonTypeDeMethode)(const char *); };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 int* UneFonction(const char*) { return NULL; } char* UneAutreFonction(const char*p) { return NULL; } typedef unsigned char T[5]; int main() { MaMethodeTrait<int>::MonTypeDeMethode L_pfnMaMethode; L_pfnMaMethode = UneFonction; L_pfnMaMethode("t"); MaMethodeTrait<char>::MonTypeDeMethode L_pfnMaMethode2; L_pfnMaMethode2 = UneAutreFonction; L_pfnMaMethode("a"); return 0; }
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Hmmm... Merci pour cet exemple, mais je crois qu'il ne correspond pas à mon besoin, parce que j'ai mal formulé la chose.
En fait, je veux templatiser l'expression (que je sais incorrecte) :
pour une utilisation dans ce gerne là :
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef (T* (*MonTypeDeMethode)(const char *)) version_courte;
Si c'est effectivement ce que tu avais compris, c'est que je suis très mauvais. :-)
Code : Sélectionner tout - Visualiser dans une fenêtre à part version_courte<T>
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
C'est moi qui ai mal du expliquer ma méthode:Et ensuite, l'utilisation:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 template<class T> struct MaMethodeTrait { typedef T* (*version_courte)(const char *); };
Code : Sélectionner tout - Visualiser dans une fenêtre à part MaMethodeTrait::version_courte<T>
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
P.S.: j'ai quand même l'impression que tu as résolus ton problème de fabrique avec une solution qui te créés encore plus de problème (cette question et les questions dans boost)... Fais un petit tour sur la FAQ sur les politiques et les traits (merci Alp), je pense que cela pourra beaucoup t'apporter dans ce que tu es en train de faire.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Tu ne peux pas avoir version_courte<T>, mais uniquement version_courte<T>::type.
Boost ftw
Petite faute de frappe (ou faute de petite frappe?). Dsl
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
J'ai pas toute les billes de ton pb,mais voilà ce que j'ai compris. Tu veux associer une classe A avec une classe B. C'est à dire pouvoir créer un objet de type B quand on te fourni un objet de type A. Dans un premier temps, tu es parti sur un patron de fabrique, ce qui me semble plutôt une bonne idée. Mais pour associer les deux classes, tu cherche à utiliser une map entre un nom de classe "A" et une fonction de création d'objet B. Et là, tu coince (d'où ce fil et celui de boost). Je pense qu'utiliser une classe trait et la spécialiser partiellement (comme présenté dans le fil http://www.developpez.net/forums/d61...tron-fabrique/) est plus adéquat et devrait solutionner tes deux problèmes.
Mais, bon, j'ai pas toute les billes de ton projet, alors c'est vrai que ma solution peut ne pas être complètement appropriée. Mais, à mon avis, tu devrais prendre le temps d'essayer cette piste.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Non. Je veux créer un objet A quand me fournit la chaine de caractères "objetA".
Map [ chaîne | pointeur de fonction ].
Ladite fonction me créant un objet du type donné.
Là, c'est plus juste. :-)Dans un premier temps, tu es parti sur un patron de fabrique, ce qui me semble plutôt une bonne idée. Mais pour associer les deux classes, tu cherche à utiliser une map entre un nom de classe "A" et une fonction de création d'objet B.
Je vois plus ce que tu proposes comme une solution alternative.Et là, tu coince (d'où ce fil et celui de boost). Je pense qu'utiliser une classe trait et la spécialiser partiellement (comme présenté dans le fil http://www.developpez.net/forums/d61...tron-fabrique/) est plus adéquat et devrait solutionner tes deux problèmes.
Mais à vrai dire, ce que j'ai actuellement fonctionne, mais foire quand je mets le map et la fonction en statique. Je ne pense pas que ton trait résoudra ce problème (si ?).
Mais je vais tout de même regarder les traits pour le problème ayant motivé ce post. Mais s'il faut en passer par des dizaines de spécialisations de template, ça n'a pas beaucoup d'intérêt. L'utilisation du trait pour chaque type sera en effet unique.
De même, l'interrogation d'un trait pour connaître le type de l'objet traité m'est inutile, car je connais déjà le type. Je veux juste alléger une écriture pour un transtypage.
En fait, pour la dernière ligne, j'ai probablement tort.
J'aurai sans doute besoin de connaître le type lorsque je voudrai appliquer un auto_ptr à l'objet renvoyé par le pointeur de fonction stocké dans le map.
Cela se présentera sûrement lundi. :-)
En fait dans ton post, tu disais:
Donc, j'en déduit qu'au moment où tu souhaite créer ton nouvel objet, tu as mieux qu'une chaîne de caractère: tu as le type de la classe.Je dispose du type de l'objet en question (fourni par une fonction membre), sous forme de chaîne...
Oui
Non. (joke: ce que j'ai actuellement fonctionne, mais foire : c'est ça fonctionner?)
En fait, soit tu passes par des dizaines de spécialisations de template, soit tu passes par des dizaines de remplissage de map .
Une map est plus appropriée pour le thread de vikki. Car lui, il ne connait pas la classe à instancier au moment de la compilation. Elle lui est donnée par la lecture de son fichier. Par contre, j'ai l'impression que lorsque tu veux instancier 'Poppins' tu sais que c'est à partir de 'Mary'. Ce sera certainement plus robuste et performant si ton association est construite/vérifiée au moment de la compilation. C'est ce que te permet le concept des traits/politiques.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
C'est ce que je disais aussi dans le thread de vikki. Le remplissage des map peut être certainement un peu alléger (dans l'écriture) avec boost::assign.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Sinon, le template typedef tel que tu souhaiterais le faire va arriver avec C++0x
Mon blog anglais - Mes articles et critiques de livres - FAQ C++0x, avec liste des nouveautés - Conseils sur le C++ - La meilleure FAQ du monde - Avant de créer des classes que vous réutiliserez, regardez si ça n'existe pas déjà - Le site du comité de normalisation du C++
Le guide pour bien débuter en C++ - Cours et tutoriels pour apprendre C++
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager