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

  FORUM HardWare.fr
  Programmation
  C++

  template et functor

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

template et functor

n°1847766
weblook$$
Posté le 06-02-2009 à 00:43:24  profilanswer
 

Hi,
 
On ne peut pas passer un functor comme paramètre template?
 

Code :
  1. #include<iostream>
  2. struct less {
  3.   bool operator() (int a, int b) const { return a < b; }
  4. };
  5. template<class T>
  6. class A
  7. {
  8. public:
  9. void f()
  10. {
  11.  std::cout<<T(2,3);
  12. }
  13. };
  14. int main()
  15. {
  16. A<less> a;
  17. a.f();
  18. }


 
Merci.

mood
Publicité
Posté le 06-02-2009 à 00:43:24  profilanswer
 

n°1847778
Joel F
Real men use unique_ptr
Posté le 06-02-2009 à 07:40:01  profilanswer
 

si sauf que ton ap^pel est faux :
 
 

Code :
  1. void f()
  2. {
  3.    T callee;
  4.    std::cout<< callee(2,3);
  5. }


 
Sidenote : les functor c'est so 1990, le hype c'ets les Polymorphic Function Object

n°1847938
weblook$$
Posté le 06-02-2009 à 13:41:21  profilanswer
 

Polymorhpic (...) je connaissais pas , merci

n°1848093
weblook$$
Posté le 06-02-2009 à 17:31:09  profilanswer
 

 
c'est quoi la différence en deux mots, y a beaucoup à lire et je me sens pas le courage today

n°1848115
Joel F
Real men use unique_ptr
Posté le 06-02-2009 à 18:17:41  profilanswer
 

un PFO est un foncteur qui supporte le protocole result_of. Il prend des arguments template et sait seul calculer le type de retour afferent.
 
On peut soit appeller un PFO comme un foncteur en l'instanciant et utilsiant son operator() soit utiliser la meta-fonctionr esult_of pr rensigner son type de retour.
 

Code :
  1. struct take_address
  2. {
  3.     template<class Sig> struct result;
  4.     template<class This,class T> struct result<This(T)>
  5.     {
  6.        typedef boost::add_pointer<T>::type type;
  7.     };
  8.     template<class T>
  9.     typename result<take_adress(T)>::type
  10.     operator()( T const& t )
  11.     {
  12.        return &t;
  13.     }
  14. };
  15. int main()
  16. {
  17.    int k;
  18.    boost::result_of<take_address(int)>::type res;
  19.  
  20.    res = take_adress()(k);
  21. }

n°1848132
weblook$$
Posté le 06-02-2009 à 18:49:12  profilanswer
 

merde je comprends rien à ton code lol

n°1848159
weblook$$
Posté le 06-02-2009 à 20:41:10  profilanswer
 

ça sert à koi ce bout de code :
 

Code :
  1. #     template<class Sig> struct result;
  2. #     template<class This,class T> struct result<This(T)>
  3. #     {
  4. #        typedef boost::add_pointer<T>::type type;
  5. #     };


 
Le This(T) surtout

n°1848161
weblook$$
Posté le 06-02-2009 à 20:51:12  profilanswer
 

non en faite c'est le Addpointer qu'est ce qu'il vient foutre ici

n°1848163
Joel F
Real men use unique_ptr
Posté le 06-02-2009 à 20:58:54  profilanswer
 

la structure interne result permet de supporté le protocole result_of :
http://www.boost.org/doc/libs/1_37 [...] #result_of

 

Il prend un type fonction pr transferer les information pr calculer le type de retour du foncteur. Maintenant ... quel est el type de &t ou T est de type T ???
T* et devine ce que add_pointer<T>::type peut bien renvoyait ...


Message édité par Joel F le 06-02-2009 à 20:59:16
n°1848201
weblook$$
Posté le 06-02-2009 à 22:48:50  profilanswer
 

ça compile pas chez moi, d'une le compilo gueule parcequ'il faut mettre typedef typename devant boost::addpointer et le  take_adress(T)
 

Code :
  1. typename result<take_adress(T)>::type
  2.     operator()( T const& t )
  3.     {
  4.        return &t;
  5.     }


 
renvoit : error C2275: 'T' : utilisation non conforme de ce type comme expression
 
 
Normal ?

mood
Publicité
Posté le 06-02-2009 à 22:48:50  profilanswer
 

n°1848256
Joel F
Real men use unique_ptr
Posté le 07-02-2009 à 08:50:57  profilanswer
 

t'as quoi comme compilateur antediluvien, VC6 ?  
t'as bien boost d'installer ?

n°1848314
weblook$$
Posté le 07-02-2009 à 13:49:40  profilanswer
 

oui j'ai boost d'installer, qui marhe correctement, et j'utilise visual 2008 express

n°1848326
weblook$$
Posté le 07-02-2009 à 14:37:01  profilanswer
 

ce qui me surprends aussi,c'est que le type de retour typename result<take_adress(T)>::type de la fonction operator() utilise cette fonction avant même qu'elle soit défini, je pensais pas que ça pouvais marcher!


Message édité par weblook$$ le 07-02-2009 à 14:37:19
n°1848350
weblook$$
Posté le 07-02-2009 à 16:11:30  profilanswer
 

et puis à quoi cela sert d'utiliser result<take_adress(T)> plutot que simplement result<T> étant donné que boost::ad_pointer ne prend que T ??

n°1848446
Joel F
Real men use unique_ptr
Posté le 07-02-2009 à 21:00:09  profilanswer
 

Y a qu'une fonction : operator(), result c'ets une meta-fonction.
t'as lu les liens du dessus ou pas ?  

n°1848453
weblook$$
Posté le 07-02-2009 à 21:19:42  profilanswer
 

bon  oui je vais lire un peu plus "profondément" , mais  je capte toujours pas pourquoi est ce que le compilo ne veut pas du code. En etnête je mets ça  
 
#include <boost/utility.hpp>
#include  <boost/type_traits/add_pointer.hpp>


Message édité par weblook$$ le 07-02-2009 à 21:20:14
n°1848454
Joel F
Real men use unique_ptr
Posté le 07-02-2009 à 21:24:14  profilanswer
 

address pas adress :o

n°1848457
weblook$$
Posté le 07-02-2009 à 21:29:18  profilanswer
 

oui erreur de frappe sur le forum

n°1848458
weblook$$
Posté le 07-02-2009 à 21:29:46  profilanswer
 

a non ! lol :$

n°1848462
weblook$$
Posté le 07-02-2009 à 21:30:58  profilanswer
 

merci ;)

n°1848510
Taz
bisounours-codeur
Posté le 07-02-2009 à 23:43:36  profilanswer
 

Je crois que ce qui déroute, c'est la syntaxe result<take_adress(T)>

n°1848511
Joel F
Real men use unique_ptr
Posté le 07-02-2009 à 23:50:15  profilanswer
 

passage d'un type fonction en parametre template ;)
toto(titi) = fonction renvoyant un type toto et prenant en argument un type titi.
 
C'ets une expression de type valide en C++, on s'en sert donc comme parametre template pr faciliter l'extraction d'information de type composés.

n°1848746
weblook$$
Posté le 08-02-2009 à 21:55:20  profilanswer
 

mais y a un soucis aussi  
 

Code :
  1. # struct take_address
  2. # {
  3. #     template<class Sig> struct result;
  4. #     template<class This,class T> struct result<This(T)>
  5. #     {
  6. #        typedef boost::add_pointer<T>::type type;
  7. #     };
  8. #
  9. #     template<class T>
  10. #     typename result<take_adress(T)>::type
  11. #     operator()( T const& t )
  12. #     {
  13. #        return &t;
  14. #     }
  15. # };


vu que &t est const et que le type de retour est non const


Message édité par weblook$$ le 08-02-2009 à 21:55:30
n°1848751
Joel F
Real men use unique_ptr
Posté le 08-02-2009 à 22:10:01  profilanswer
 

ouais peut etre, mais bon, pas dur de completer pour que ça marche à titre d'exercice :o

n°1849989
weblook$$
Posté le 11-02-2009 à 17:47:54  profilanswer
 

une autre chose que je comprends pas:
 
 

Code :
  1. struct take_address
  2.    2. {
  3.    3.     template<class Sig> struct result;
  4.    4.     template<class This,class T> struct result<This(T)>
  5.    5.     {
  6.    6.        typedef boost::add_pointer<T>::type type;
  7.    7.     };
  8.    8.
  9.    9.     template<class T>
  10.   10.     typename result<take_adress(T)>::type
  11.   11.     operator()( T const& t )
  12.   12.     {
  13.   13.        return &t;
  14.   14.     }
  15.   15. };
  16.   16.
  17.   17. int main()
  18.   18. {
  19.   19.    int k;
  20.   20.    boost::result_of<take_address(int)>::type res;
  21.   21. 
  22.   22.    res = take_adress()(k);
  23.   23. }


 
Pourquoi est ce que a un endroit du code on utilise take_adress()() et un à autre take_adresse() ?

Message cité 1 fois
Message édité par weblook$$ le 11-02-2009 à 17:49:42
n°1849991
weblook$$
Posté le 11-02-2009 à 17:52:53  profilanswer
 

également :
 
dans cette partie là du code :
 

Code :
  1. template<class T>
  2.         typename result<take_adress(T)>::type
  3.         operator()( T const& t )
  4.         {
  5.            return &t;
  6.         }


 
quel est le véritable paaramètre passé à result :
 
- take_adress(T)
ou  
- &t  
 
?

n°1849995
Joel F
Real men use unique_ptr
Posté le 11-02-2009 à 18:00:58  profilanswer
 

weblook$$ a écrit :


Pourquoi est ce que a un endroit du code on utilise take_adress()() et un à autre take_adresse() ?


 
le premeir on construit un objet take_address et on appelle son operateur()
le deuxieme on construit un type fonction renvoyant un take_address.
 

Citation :


quel est le véritable paaramètre passé à result :


- take_adress(T)  
 
result calcul un type et non une valeur

n°1850031
weblook$$
Posté le 11-02-2009 à 19:11:04  profilanswer
 

Joel F a écrit :


 
le deuxieme on construit un type fonction renvoyant un take_address.
 

 
 

Code :
  1. typename result<take_adress(T)>::type
  2.      operator()( T const& t )
  3.     {
  4.      return &t;
  5.     }


 
Avec cette syntaxe là, take_address(T), on appel donc pas l'opérateur() ?


Message édité par weblook$$ le 11-02-2009 à 19:11:47
n°1850035
Joel F
Real men use unique_ptr
Posté le 11-02-2009 à 19:14:10  profilanswer
 

non on construit un type qui est :
"fonction prenant un argument de Type T et renvoyant take_address"
il n'ets la que pour transporter les infos sur le lieu d'evaluation du type de result

n°1850042
weblook$$
Posté le 11-02-2009 à 19:23:58  profilanswer
 

donc take_adress(T) est équivalent à "take_adress f(T)" , sauf que l'on ne donne pas de nom à la fonction ?

n°1850048
Joel F
Real men use unique_ptr
Posté le 11-02-2009 à 19:37:42  profilanswer
 

oui et non, ce qui nous interesse c'ets juste son type

n°1850051
weblook$$
Posté le 11-02-2009 à 19:40:47  profilanswer
 

que veux donc tu dires par,
 
 
"fonction prenant un argument de Type T et renvoyant take_address"

n°1850054
Joel F
Real men use unique_ptr
Posté le 11-02-2009 à 19:47:32  profilanswer
 

bah c'ets le type de take_address(T)

n°1850058
weblook$$
Posté le 11-02-2009 à 20:06:31  profilanswer
 

:pt1cable: , j'arrive pas avec ce code à compredre le pourquoi du comment , ça me rend ouf
 
ce qui m'échappe c'est qu'au final on aurait écrit :
 

Code :
  1. 1. struct take_address
  2.    2. { 
  3.    4.     template<class T> struct result
  4.    5.     {
  5.    6.        typedef boost::add_pointer<T>::type type;
  6.    7.     };
  7.    8.
  8.    9.     template<class T>
  9.   10.     typename result<T>::type
  10.   11.     operator()( T const& t )
  11.   12.     {
  12.   13.        return &t;
  13.   14.     }
  14.   15. };
  15.   16.
  16.   17. int main()
  17.   18. {
  18.   19.    int k;
  19.   20.    boost::result_of<int>::type res;
  20.   21. 
  21.   22.    res = take_adress()(k);
  22.   23. }


 
ça serait revenu au meme non?... et c'est en l'écrivant que je m'apperçois que non, y a effectivement un soucy avec le result_of<int>


Message édité par weblook$$ le 11-02-2009 à 20:19:53
n°1850106
Joel F
Real men use unique_ptr
Posté le 11-02-2009 à 22:37:35  profilanswer
 

oui, t'as pas lu la doc que je t'ai passer.
Ensuite, un protocole on le suit sinon ca sert à rien :o

n°1850349
weblook$$
Posté le 12-02-2009 à 14:09:37  profilanswer
 

oui mais j'ai rien capté à la doc :

 

The class template result_of helps determine the type of a call expression. Given an lvalue f of type F and lvalues t1, t2, ..., tN of types T1, T2, ..., TN, respectively, the type result_of<F(T1, T2, ..., TN)>::type defines the result type of the expression f(t1, t2, ...,tN). The implementation permits the type F to be a function pointer, function reference, member function pointer, or class type. When F is a class type with a member type result_type, result_of<F(T1, T2, ..., TN)> is F::result_type. Otherwise, result_of<F(T1, T2, ..., TN)> is F::result<F(T1, T2, ..., TN)>::type when N > 0 or void when N = 0. For additional information about result_of, see the C++ Library Technical Report, N1836, or, for motivation and design rationale, the result_of proposal.


Message édité par weblook$$ le 12-02-2009 à 14:14:00
n°1850356
weblook$$
Posté le 12-02-2009 à 14:15:16  profilanswer
 

comment est ce  que l'expression f(t1, t2, ...,tN) peut avoir un type???

n°1850529
Joel F
Real men use unique_ptr
Posté le 12-02-2009 à 18:07:19  profilanswer
 

c'est un appel de fonction, son result_type est son type de retour qui depend polymorphqiuement des types de ces entrées. Point y a rien de sorcier, c'est les trucs de bases sur le typage des fonctions.

n°1850544
weblook$$
Posté le 12-02-2009 à 18:59:05  profilanswer
 

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

Message cité 1 fois
Message édité par weblook$$ le 12-02-2009 à 18:59:48
n°1850545
Un Program​meur
Posté le 12-02-2009 à 19:08:21  profilanswer
 

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   profilanswer
 

 Page :   1  2
Page Précédente

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

  template et functor

 

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)