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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

template et functor

n°1850545
Un Program​meur
Posté le 12-02-2009 à 19:08:21  profilanswer
 

Reprise du message précédent :

weblook$$ a écrit :

bah rien de sorcier rien de sorcier elle est bien bonne celle là!
le type que retourne une fonction, à ce que je saches  :o , n'est pas fonction de ses entrées....


 
Le C++ ne supporte pas la surcharge uniquement sur le type de retour des fonctions.  Donc quand tu as le nom et le type des paramètres, tu as le type de retour (sauf s'il y a une ambiguité).

mood
Publicité
Posté le 12-02-2009 à 19:08:21  profilanswer
 

n°1850546
weblook$$
Posté le 12-02-2009 à 19:10:44  profilanswer
 

ah ok, mais quelle fonction du C++ permet de nous l'indiquer ? je comprends bien que effectivment le compilateur sait de quelle fonction il s'agit mais dans le code source, comment peut-on faire ça ?

Message cité 1 fois
Message édité par weblook$$ le 12-02-2009 à 19:11:25
n°1850547
Joel F
Real men use unique_ptr
Posté le 12-02-2009 à 19:14:28  profilanswer
 

en utilisant le protocole result_of ...

n°1850549
weblook$$
Posté le 12-02-2009 à 19:24:19  profilanswer
 

:whistle: ok lol

n°1850556
Un Program​meur
Posté le 12-02-2009 à 20:08:46  profilanswer
 

weblook$$ a écrit :

ah ok, mais quelle fonction du C++ permet de nous l'indiquer ? je comprends bien que effectivment le compilateur sait de quelle fonction il s'agit mais dans le code source, comment peut-on faire ça ?


 
Comment faire quoi à partir de quelles données?

n°1850572
weblook$$
Posté le 12-02-2009 à 21:26:09  profilanswer
 

être en mesure de pouvoir identifier le type de retour d'une fonction, en fonction de ses paramatères, à priori  c'est de ça qu'il est question avec result_of


Message édité par weblook$$ le 12-02-2009 à 21:35:53
n°1850641
Un Program​meur
Posté le 13-02-2009 à 02:27:09  profilanswer
 

result_of te permet de savoir quel est le type du résultat de l'application de l'opérateur () avec des paramètres de type donné à des valeurs d'un type donné.  C'est principalement utile quand ce type est un paramètre template et déduit automatiquement.
 
Si ce type est un type appelable "de base" (fonction, pointeur sur fonction, pointeur sur fonction membre), result_of fonctionne tout seul.  Si ce type est une classe avec un opérateur (), il faut que cette classe respecte des conventions (ce que Joel appelle un protocole); celles-ci sont nécessaires car il peut y avoir plusieurs opérateurs () et les techniques de méta-programmation ne permettent pas d'effectuer la résolution de surcharge, on déplace le problème en demandant à celui qui écrit la classe de résoudre le problème tout seul.

n°1850679
weblook$$
Posté le 13-02-2009 à 09:25:24  profilanswer
 

présenté comme ça, ça passe tout seul, merci beaucoup

n°1850690
Un Program​meur
Posté le 13-02-2009 à 09:57:17  profilanswer
 

Et j'oubliais une des subtilites de result_of:  le type qu'on passe a result_of n'est pas le type sur lequel on applique l'operateur (), mais un type fonction retournant ce type la et prenant les parametres passes.  C'est un type un artificiel dont l'interet principal est qu'il permet de se passe de type lists.
 
Donc si tu cherches a savoir quel est le type resultat de l'operateur() avec un float applique a un pointeur sur fonction prenant un double et retournant un double en utilisant result_of, tu utilises

Code :
  1. result_of<double(*(float))(double)>::type


a part que personne ne le fait sans passer par un typedef:

Code :
  1. typedef  double (*Fn)(double);
  2. result_of<Fn(float)>::type;


ou meme deux:

Code :
  1. typedef double (*Fn)(double);
  2. typedef Fn ArgForResult(float);
  3. result_of<ArgForResult>::type;

n°1850713
weblook$$
Posté le 13-02-2009 à 10:29:51  profilanswer
 

Et dans quel contexte infiné à t-on besoin de recourir à result_of, ou autrement dit, de pouvoir déterminer le type retourné par l'operateur () ?

Message cité 1 fois
Message édité par weblook$$ le 13-02-2009 à 10:30:02
mood
Publicité
Posté le 13-02-2009 à 10:29:51  profilanswer
 

n°1850714
weblook$$
Posté le 13-02-2009 à 10:34:36  profilanswer
 

dans le cas où l'on a un foncteur templaté donc, c'est ça ?

n°1850723
Un Program​meur
Posté le 13-02-2009 à 10:49:31  profilanswer
 

weblook$$ a écrit :

Et dans quel contexte infiné à t-on besoin de recourir à result_of, ou autrement dit, de pouvoir déterminer le type retourné par l'operateur () ?


 
Principalement quand tu ecris un template et que le type appelable est un parametre template.

n°1850729
weblook$$
Posté le 13-02-2009 à 11:03:54  profilanswer
 

et que l'on a besoin de connaitre son type de retour ?,c'est précisement ça:

 

dans le cas où l'on a un paramètre template qui est une fonction ou un pointeur sur fonction, et que l'on doit pouvoir déterminer le type de retour de la fonction ou du pointeur sur fonction appelée en interne, car cela peut être fonction de ses paramètres ?


Message édité par weblook$$ le 13-02-2009 à 11:06:23
n°1850957
weblook$$
Posté le 13-02-2009 à 17:29:08  profilanswer
 

bon oui ok rien de sorcier effectivment mais bon y a t-il un rappport entre le titre du sujet et le code avec le result_of je suis pas sur car au final le result_of ne prends pas un foncteur

n°1850973
Un Program​meur
Posté le 13-02-2009 à 17:48:34  profilanswer
 

Il prend un foncteur et la liste des types des parametres que tu veux lui passer le tout encode comme une fonction retournant ce foncteur.


Message édité par Un Programmeur le 13-02-2009 à 17:49:09
n°1851139
weblook$$
Posté le 14-02-2009 à 13:48:48  profilanswer
 

dans le fichier result_of y a cette syntaxe :
 
template<typename F, typename FArgs>
struct result_of_nested_result : F::template result<FArgs>
{};
 
 
c'est quoi le : F::template result<FArgs> ????
 
Normalement pour l'héritage on spécifiie public,private etc

n°1851149
Un Program​meur
Posté le 14-02-2009 à 14:21:57  profilanswer
 

F::result est un nom dépendant d'un paramètre template.  Pour signifier qu'il est lui-même un template, il faut le template.  L'héritage suit ici son mode de protection par défaut, public puisque c'est défini comme struct.

n°1851159
weblook$$
Posté le 14-02-2009 à 14:51:21  profilanswer
 

c'est étonnant d'ailleurs car dans ce fichier result_of est  définit uniquement de cette sorte template<typename F> struct result_of;
 
ça serait intéréssant de savoir de quelle manière le compilo fait le lien avec les différents result_of_impl

n°1851220
weblook$$
Posté le 14-02-2009 à 17:52:36  profilanswer
 

@Programmeur: où vois-tu dans le fichier d'implémentation de result_of que result_of prend un foncteur?


Message édité par weblook$$ le 14-02-2009 à 17:52:54
n°1851221
Joel F
Real men use unique_ptr
Posté le 14-02-2009 à 17:59:14  profilanswer
 

weblook$$ a écrit :

c'est étonnant d'ailleurs car dans ce fichier result_of est  définit uniquement de cette sorte template<typename F> struct result_of;
 
ça serait intéréssant de savoir de quelle manière le compilo fait le lien avec les différents result_of_impl


 
Par spécialisation partielle sur des traits de F

n°1851237
weblook$$
Posté le 14-02-2009 à 19:17:24  profilanswer
 

pourtant dans le fichier result_of, la seule implémentation de result_of est celle que que j'ai mentionnée au dessus, donc quand on fait boost::result_of<T> ça appel quoi ???

 

y a pas de spécialisation partielle définit sur result_of, du moins pas directement, il n'y a que des spécialisations partielles sur la classe nommée: result_of_impl


Message édité par weblook$$ le 14-02-2009 à 19:19:25
n°1851238
Joel F
Real men use unique_ptr
Posté le 14-02-2009 à 19:27:05  profilanswer
 

comme indiqué dans le fichier, les surcharges de result_of appelant result_of_impl sont générées par une itération verticale du fichier detail/result_of_iterate

n°1851242
weblook$$
Posté le 14-02-2009 à 19:37:56  profilanswer
 

ok!  


Message édité par weblook$$ le 14-02-2009 à 19:38:56
n°1855850
weblook$$
Posté le 27-02-2009 à 09:37:48  profilanswer
 

Un Programmeur a écrit :

Et j'oubliais une des subtilites de result_of:  le type qu'on passe a result_of n'est pas le type sur lequel on applique l'operateur (), mais un type fonction retournant ce type la et prenant les parametres passes.  C'est un type un artificiel dont l'interet principal est qu'il permet de se passe de type lists.
 
Donc si tu cherches a savoir quel est le type resultat de l'operateur() avec un float applique a un pointeur sur fonction prenant un double et retournant un double en utilisant result_of, tu utilises

Code :
  1. result_of<double(*(float))(double)>::type


a part que personne ne le fait sans passer par un typedef:

Code :
  1. typedef  double (*Fn)(double);
  2. result_of<Fn(float)>::type;


ou meme deux:

Code :
  1. typedef double (*Fn)(double);
  2. typedef Fn ArgForResult(float);
  3. result_of<ArgForResult>::type;



 
FInalement je n'ai pas compris ce message, surtout la phrase  
 
Donc si tu cherches a savoir quel est le type resultat de l'operateur() avec un float applique a un pointeur sur fonction prenant un double et retournant un double
 
le type resultat de l'operateur() avec un float : C'est à dire avec un float?

n°1858727
weblook$$
Posté le 07-03-2009 à 11:36:14  profilanswer
 

ci-dessous un bout de code qui illustre bien l'intêrét, en pratique, de result_of :
 

Code :
  1. struct clear
  2. {
  3.   int    operator()( int    ) ;  // The parameter type is
  4.   double operator()( double ) ;  // equal to the return type.
  5. } ;
  6. //////////////
  7. template< class Obj > class calculus
  8. {
  9.   public:
  10.     template< class Arg > Arg operator()( Arg& a ) const
  11.     {
  12.       return member(a) ;
  13.     }
  14.   private:
  15.     Obj member ;
  16. } ;


 
 

Code :
  1. struct confused
  2. {
  3.   double operator()( int    ) ;  // The parameter type is NOT
  4.   int    operator()( double ) ;  // equal to the return type.
  5. } ;
  6. //////////////
  7. template< class Obj >
  8. class calculus_ver2
  9. {
  10.   public:
  11.     template< class Arg >
  12.     typename std::result_of<Obj(Arg)>::type operator()( Arg& a ) const
  13.     {
  14.       return member(a) ;
  15.     }
  16.   private:
  17.     Obj member ;
  18. } ;


Message édité par weblook$$ le 07-03-2009 à 11:38:45
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
template et version des compilateursclasse template avec pointeur membre sur la classe
template template parameterstemplate syntaxe
précision: template et inlineProbleme de compilation avec les template
[Résolu]Passage d'un template non défini entièrement à une fonctionproblème sur un template
Manipulation d'un nom de template dans une #define-macroappel d'un template xsl-fo !
Plus de sujets relatifs à : template et functor


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