template et functor

template et functor - C++ - Programmation

Marsh Posté le 06-02-2009 à 00:43:24    

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.

Reply

Marsh Posté le 06-02-2009 à 00:43:24   

Reply

Marsh Posté le 06-02-2009 à 07:40:01    

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

Reply

Marsh Posté le 06-02-2009 à 13:41:21    

Polymorhpic (...) je connaissais pas , merci

Reply

Marsh Posté le 06-02-2009 à 17:31:09    

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

Reply

Marsh Posté le 06-02-2009 à 18:17:41    

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

Reply

Marsh Posté le 06-02-2009 à 18:49:12    

merde je comprends rien à ton code lol

Reply

Marsh Posté le 06-02-2009 à 20:41:10    

ç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

Reply

Marsh Posté le 06-02-2009 à 20:51:12    

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

Reply

Marsh Posté le 06-02-2009 à 20:58:54    

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
Reply

Marsh Posté le 06-02-2009 à 22:48:50    

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

Reply

Marsh Posté le 06-02-2009 à 22:48:50   

Reply

Marsh Posté le 07-02-2009 à 08:50:57    

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

Reply

Marsh Posté le 07-02-2009 à 13:49:40    

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

Reply

Marsh Posté le 07-02-2009 à 14:37:01    

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
Reply

Marsh Posté le 07-02-2009 à 16:11:30    

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

Reply

Marsh Posté le 07-02-2009 à 21:00:09    

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

Reply

Marsh Posté le 07-02-2009 à 21:19:42    

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
Reply

Marsh Posté le 07-02-2009 à 21:24:14    

address pas adress :o

Reply

Marsh Posté le 07-02-2009 à 21:29:18    

oui erreur de frappe sur le forum

Reply

Marsh Posté le 07-02-2009 à 21:29:46    

a non ! lol :$

Reply

Marsh Posté le 07-02-2009 à 21:30:58    

merci ;)

Reply

Marsh Posté le 07-02-2009 à 23:43:36    

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

Reply

Marsh Posté le 07-02-2009 à 23:50:15    

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.

Reply

Marsh Posté le 08-02-2009 à 21:55:20    

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
Reply

Marsh Posté le 08-02-2009 à 22:10:01    

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

Reply

Marsh Posté le 11-02-2009 à 17:47:54    

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
Reply

Marsh Posté le 11-02-2009 à 17:52:53    

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

Reply

Marsh Posté le 11-02-2009 à 18:00:58    

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

Reply

Marsh Posté le 11-02-2009 à 19:11:04    

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
Reply

Marsh Posté le 11-02-2009 à 19:14:10    

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

Reply

Marsh Posté le 11-02-2009 à 19:23:58    

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

Reply

Marsh Posté le 11-02-2009 à 19:37:42    

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

Reply

Marsh Posté le 11-02-2009 à 19:40:47    

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

Reply

Marsh Posté le 11-02-2009 à 19:47:32    

bah c'ets le type de take_address(T)

Reply

Marsh Posté le 11-02-2009 à 20:06:31    

: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
Reply

Marsh Posté le 11-02-2009 à 22:37:35    

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

Reply

Marsh Posté le 12-02-2009 à 14:09:37    

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
Reply

Marsh Posté le 12-02-2009 à 14:15:16    

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

Reply

Marsh Posté le 12-02-2009 à 18:07:19    

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.

Reply

Marsh Posté le 12-02-2009 à 18:59:05    

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
Reply

Marsh Posté le 12-02-2009 à 19:08:21    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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