syntaxe : typedef typename F::template

syntaxe : typedef typename F::template - C++ - Programmation

Marsh Posté le 24-10-2009 à 21:38:14    

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


---------------
.
Reply

Marsh Posté le 24-10-2009 à 21:38:14   

Reply

Marsh Posté le 24-10-2009 à 22:33:28    

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
Reply

Marsh Posté le 24-10-2009 à 23:09:07    

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


---------------
.
Reply

Marsh Posté le 24-10-2009 à 23:36:21    

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
Reply

Marsh Posté le 24-10-2009 à 23:48:29    

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

---------------
.
Reply

Marsh Posté le 24-10-2009 à 23:55:51    

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


---------------
.
Reply

Marsh Posté le 25-10-2009 à 00:04:16    

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

Reply

Marsh Posté le 25-10-2009 à 00:21:53    

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


---------------
.
Reply

Marsh Posté le 25-10-2009 à 00:47:15    

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
Reply

Marsh Posté le 25-10-2009 à 07:48:39    

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
Reply

Marsh Posté le 25-10-2009 à 07:48:39   

Reply

Marsh Posté le 25-10-2009 à 08:00:11    

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.

Reply

Marsh Posté le 25-10-2009 à 19:31:16    

d'ac merci


---------------
.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed