Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2844 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  syntaxe : typedef typename F::template

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

syntaxe : typedef typename F::template

n°1935165
Glock 17Pr​o
Posté le 24-10-2009 à 21:38:14  profilanswer
 

Code :
  1. template <class F, class X>
  2. struct twice
  3. {
  4.     typedef typename F::template apply<X>::type once;    // f(x)
  5.     typedef typename F::template apply<once>::type type; // f(f(x))
  6. };


 
c'est quoi F::template ??


---------------
.
mood
Publicité
Posté le 24-10-2009 à 21:38:14  profilanswer
 

n°1935167
Amonchakai
Posté le 24-10-2009 à 22:33:28  profilanswer
 

C'est quand apply est une méta-fonction de la classe définie par F.
 
On aurai tendance a écrire F::apply, mais la syntaxe est F::template apply
 
[edit] Il y a une brève explication ici : http://www.boost.org/doc/libs/1_40 [...] order.html
[re edit] Je viens de voir que ton exemple venais justement de la...  :D Ben, lit un peu plus bas...


Message édité par Amonchakai le 24-10-2009 à 22:38:23
n°1935171
Glock 17Pr​o
Posté le 24-10-2009 à 23:09:07  profilanswer
 

c'est à dire métafonction ? tu peux me donner un exmple de code de ce que apply


---------------
.
n°1935174
Amonchakai
Posté le 24-10-2009 à 23:36:21  profilanswer
 

Une méta-fonction est une fonction qui s'applique sur des types. Par exemple, tu peux définir la méta-fonction AddPointer qui permet de passer du type int a int* comme ça:
 

Code :
  1. struct AddPointer {
  2.     template<typename T>
  3.     struct apply {
  4.         typedef T* type;
  5.     };
  6. };
  7. int main() {
  8.     typedef AddPointer::apply<int>::type TPInt;
  9.     // et ici, TPInt est un type pointeur sur int...
  10.     return 0;
  11. }


 
Après dans ton exemple d'avant tu prenais dans tes arguments une méta-fonction et un type sur lequel tu applique ta méta-fonction.
Donc tu l'utiliserai comme ça:
 

Code :
  1. int main() {
  2.     AddPointer::apply<int>::type TPInt;
  3.     // et ici, TPInt est un pointeur sur int...
  4.     twice<AddPointer, int>::type TDPInt;
  5.     return 0;
  6. }


 
Et donc la syntaxe veut que quand tu veux appeler une structure au sein d'un type générique F, tu fais F::template apply (avec apply ta structure qui se trouve dans F). Pour accéder au F::apply
 
Pas sur d'être super clair  :D


Message édité par Amonchakai le 24-10-2009 à 23:43:13
n°1935175
Glock 17Pr​o
Posté le 24-10-2009 à 23:48:29  profilanswer
 

nikel merci
 
en faite je me demande à quoi ça sert davoir un truc :
 

Code :
  1. AddPointer::apply<int>::type TPInt;


 
qui sert in finé à définir un int* , ça ressemble un peu à un marteau pour tuer une mouche


Message édité par Glock 17Pro le 24-10-2009 à 23:55:00

---------------
.
n°1935176
Glock 17Pr​o
Posté le 24-10-2009 à 23:55:51  profilanswer
 

et le Addpointer, je capte pas pourquoi ce nom , ça ajoute des pointeurs ??


---------------
.
n°1935177
Amonchakai
Posté le 25-10-2009 à 00:04:16  profilanswer
 

Oui, tout a fait cela permet de définir int* a partir de int.  
 
Bah, la tout de suite l'utilité... :D Ça serai au moment ou l'on a besoin d'une meta-fonction pour definir un pointeur sur le type passé en paramètre.
 
Je conclurai par dire qu'il y a des choses plus intéressante a faire avec de la méta-prog et que ce type de fonction peuvent servir dans l'élaboration des choses intéressante. ;)
 
Et pour le nom, j'ai rien inventé : cela viens de boost : http://www.boost.org/doc/libs/1_40 [...] inter.html

n°1935178
Glock 17Pr​o
Posté le 25-10-2009 à 00:21:53  profilanswer
 

en faite .. ça permets de faire quoi concrétement la méta prog et particulièrement en cpp


---------------
.
n°1935179
Amonchakai
Posté le 25-10-2009 à 00:47:15  profilanswer
 

Bah, a plein de choses... Si tu prend l'exemple de boost il est en est bourré de méta-prog. Ca permet d'avoir de belle interface comme boost::function, boost::sprit, ... D'automatiser la génération de code...
 
Pour moi, un des grand principe de la méta-prog c'est aussi d'arriver a repousser les erreur du run-time a la compilation. Pour que ça soit ton compilo qui vérifie la cohérence de ton code (par exemple tu peux voir l'analyse dimensionnelle qui est proposée dans les tutoriaux de la MPL)
 
après, j'ai envie de te dire d'attendre l'avis des ténors de la cat'. Je reste quand même un gros débutant, je suis sur qu'ils auront des choses a rajouter sur cette question de l'intéret :)


Message édité par Amonchakai le 25-10-2009 à 00:52:33
n°1935198
Joel F
Real men use unique_ptr
Posté le 25-10-2009 à 07:48:39  profilanswer
 

Meta-programmer c'est analyser, modifier et generer du code à aprtir de code, et ce à la compilation. En c++, cela passe par le détournement des mécanismes de spécialisations et de résolutions de types et le fait que les templates C++ soit turing-complet et beta-reductibles. C'est une des pierres angulaires de la Programmation Générique ( http://www.generic-programming.org ) qui est une ensemble d'idiome bien plus puissant que le simple OO.

 

A quoi ça sert, à plein de chose. Et en premier lieu à écrire du code générique, réutilisable au niveau source en garantissant un bon typage, de bonnes performances car la totalité des trucs est résolue à la compilation et osuvent une interface humainement lisible et intuitive. En terme d'usages : le calcul de type complexe, la manipulation de structure à la volée (boost.Fusion), l'introspection de type (boost.traits), les Expressions Tempaltes qui ne sont que meta-prog (boost.proto) etc. En terme d'applications concrètes, je te renvois à ma liste de publications scientifiques :o
mais en outre grâce à ça, y a des outils de parallélisations automatiques, de générations d'architectures matérielles, d'accès pervasives à des réseaux de capteurs etc.

 

Et à quoi ca sert AddPointer ? A avoir qqs choses de génériques pour passer de T à T* car si dans le cas général, y a pas d'astuce si T est une référence, T* n'existe pas. Au lieu de devoir prendre  ce cas particulier en compte dans ton code, il te suffit d'utilsier systematiquement add_pointer<T>::type pour etre sur de pas faire de conneries.


Message édité par Joel F le 25-10-2009 à 07:52:23
mood
Publicité
Posté le 25-10-2009 à 07:48:39  profilanswer
 

n°1935199
Joel F
Real men use unique_ptr
Posté le 25-10-2009 à 08:00:11  profilanswer
 

Sinon
 
typename F::template foo
 
est la synatxe pour acceder à des types templates interne à des classes.
De la meme maniere que typename aide le compilo à pas se vautrer en lui disant qu'il s'agit d'un type, le ::tempalte lui indique la validité de la syntaxe foo<???> qui va suivre.

n°1935264
Glock 17Pr​o
Posté le 25-10-2009 à 19:31:16  profilanswer
 

d'ac merci


---------------
.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  syntaxe : typedef typename F::template

 

Sujets relatifs
[Résolu] Problème syntaxe xhtml[Boost::random] Template comme argument d'une fonction...
URL syntaxeErreur de syntaxe SQL. Help !
La syntaxe de FOAF[Résolu] [vba] aide à la syntaxe pour la dimension d'un tableau
Namspace déclarant un template externedébloquer balises <keywords >sur template
Problème Template matching matlab quel façon coder ce template épuré en CSS et html ?
Plus de sujets relatifs à : syntaxe : typedef typename F::template


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)