ptr_fun bind2nd

ptr_fun bind2nd - C++ - Programmation

Marsh Posté le 31-10-2009 à 13:15:59    

Code :
  1. #define range( x ) x.begin(),x.end()
  2. string addTime (const string& src, const string& add) 
  3. {
  4.   return src + " " + add;
  5. }
  6. int main()
  7. {
  8. vector<string> vec;
  9. vec.push_back("word4" );
  10. vec.push_back("word2" );
  11. vec.push_back("word6" );
  12. transform( range(vec), vec.begin(), bind2nd( ptr_fun(addTime)," hh:mm:ss" ) );
  13. copy ( range(vec), ostream_iterator<string>(ofstream( "toto.txt" , ios::trunc),";" ) );
  14. system("pause" );
  15. }


 
qu'est ce qui ne vas pas dans l'appel à la fonction transform ?
 
merci


Message édité par Glock 17Pro le 31-10-2009 à 13:19:14

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

Marsh Posté le 31-10-2009 à 13:15:59   

Reply

Marsh Posté le 31-10-2009 à 14:21:53    

j'ai pas le droit de passer les arguments par référence .?why


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

Marsh Posté le 31-10-2009 à 14:40:00    

D'après ce que je viens de lire le problème me semblerai venir du bind2nd.
 
Celui-ci ne supportant pas les références, il faudrait un warper de la même façon que boost règle le pb avec boost::ref...
 
A priori dans la STL, faut aller voir du côté de std::tr1::bind


Message édité par Amonchakai le 31-10-2009 à 14:40:42
Reply

Marsh Posté le 31-10-2009 à 14:53:07    

les bind de la STL sont obsoletes. Utilise boost::bind et boost::lambda


Message édité par Joel F le 31-10-2009 à 14:53:18
Reply

Marsh Posté le 31-10-2009 à 15:58:21    

c'est normal que ça ne compile pas ça :
 
result_of< bind(std::less<int>(),_1,2) >::type;


Message édité par Glock 17Pro le 31-10-2009 à 16:01:59

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

Marsh Posté le 01-11-2009 à 11:21:01    

bind c'ets une fonction par un type.
Accessoirement le type de retour de bind est tres complexe et a peu d'interet vu que ca se stocke dans un boost::function.


Message édité par Joel F le 01-11-2009 à 11:21:44
Reply

Marsh Posté le 01-11-2009 à 13:07:45    

le problème c'est que ça implique de connaitre/spécifier le type exact de l'objet function résultant de bind que l'on souhaite stocké dans un objet boost::function, sauf erreur de ma part


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

Marsh Posté le 01-11-2009 à 13:32:50    

non tu as besoin de son prototype c'est tout.

 

bind(std::less<int>(),_1,2) a pour prototype  bool(int)
dont tu mets ton bind dans un boost::function<bool(int)>

 

et mieux tu utilise cash _1 < 2 dans ton appel vu tu as acces à de vrais lambda


Message édité par Joel F le 01-11-2009 à 13:33:33
Reply

Marsh Posté le 01-11-2009 à 15:50:05    

faut mettre quoi comme directive using pour que _1 soit reconnu quand on utlise bind de lambda ?
 

Code :
  1. #include <boost/lambda/lambda.hpp>
  2. #include <boost/lambda/bind.hpp >
  3. using boost::lambda::bind;


ne suffit pas
 
 
EDIT : using boost::lambda; OK


Message édité par Glock 17Pro le 01-11-2009 à 15:58:07

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

Marsh Posté le 01-11-2009 à 15:59:21    

énorme cette librairie lambda


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

Marsh Posté le 01-11-2009 à 15:59:21   

Reply

Marsh Posté le 01-11-2009 à 16:23:46    

à minima pour utiliser boost::lamnda dans un projet on a besoin de  quoi comme entête ?


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

Marsh Posté le 01-11-2009 à 16:52:02    

boost/lambda/lambda.hpp et boost/lambda/bind.hpp de tete
Je te conseil aussi d ejeter un oeil à Phoenix qui etends lambda.

Reply

Marsh Posté le 01-11-2009 à 18:59:21    

à terme les deux vont fusioner ?


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

Marsh Posté le 01-11-2009 à 19:50:49    

oui on (je) travaille sur ça

Reply

Marsh Posté le 01-11-2009 à 19:52:04    

et la lib bind continuera de subsister à côté ?


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

Marsh Posté le 01-11-2009 à 19:53:49    

ouais pour comaptibilité ascendante.

Reply

Marsh Posté le 01-11-2009 à 22:38:52    

Quelle genre de fonctionnalité la lib phoenix n'implémentera pas ? (par rapport à un vrai langage fonctionelle )


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

Marsh Posté le 01-11-2009 à 22:47:19    

je sais pas. EN gros l'idée de Phoenix et de forunir tout C++ en mode lazy-evaluable. Genre

 
Code :
  1. boost::function<int(int)> f =
  2.   if_(_1 > 100)
  3.   [
  4.      cout << _1 << "is OK" ,
  5.      return_(_1/100);
  6.   ]
  7.   .else_
  8.   [
  9.      cout << _1 << "is not OK" ,
  10.      return_(_1);
  11.   ];

Message cité 1 fois
Message édité par Joel F le 01-11-2009 à 22:47:29
Reply

Marsh Posté le 02-11-2009 à 01:39:45    

on entends quoi par "lazy-evaluable" ?


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

Marsh Posté le 02-11-2009 à 08:20:44    

bah evalutation paresseuse. Tu ecris du C++ mais tu défére son exécution.

Reply

Marsh Posté le 02-11-2009 à 22:01:55    

quel est le principal intérêt ?


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

Marsh Posté le 02-11-2009 à 22:08:28    

Reply

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

Joel F a écrit :

je sais pas. EN gros l'idée de Phoenix et de forunir tout C++ en mode lazy-evaluable. Genre
 

Code :
  1. boost::function<int(int)> f =
  2.   if_(_1 > 100)
  3.   [
  4.      cout << _1 << "is OK" ,
  5.      return_(_1/100);
  6.   ]
  7.   .else_
  8.   [
  9.      cout << _1 << "is not OK" ,
  10.      return_(_1);
  11.   ];



 
mais en quoi ici on a "The benefits of lazy evaluation include: performance increases due to avoiding unnecessary calculations"
 
in finé ça revient au même que d'éxécuter une fonction, je capte pas l'avantage
 
 


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

Marsh Posté le 03-11-2009 à 07:52:16    

l'avantage c'ets que une fois construit, tu peux passer f à une autre fonction. et l'évaluer pluis tard.

Reply

Marsh Posté le 03-11-2009 à 08:00:50    

mais d'ou provient le gain en performance exactement ? à l'exécution quand la fonction qui reçoit ce pointeur sur ce code en paramètre est appelée, l'éxécution/évaluation à lieu, et donc à priori  ça va prendre le même temps CPU.
 
Autrement dit ma question est en quoi le fait de délayer l'évaluation induit un gain en perf
 
PS: l'évaluation et l'exécution ça désigne deux choses différentes ?


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

Marsh Posté le 03-11-2009 à 08:06:15    

L'idée est de créée une representation du code sous forme transportable qui n'est pas évalué. Puis, tu n'évalueras cette fonction que si tu en as réeellement besoin.

 

"L'évaluation paresseuse est une technique de programmation où le programme n'exécute pas de code avant que les résultats de ce code ne soient réellement nécessaires."

 

Dans l'exemple f ne fait que construire un objet fonction. rien n'est executé tant que f(x) n'est pas appelé. Dans un cadre plus dynamique, tu peut ne jamais avoir à l'appeler, là ou si tu avais évaluer directement tu aurais consommé du CPU pour rien.

 


L'aure exemple ets le cas de la fonction qui construit une fonction recursivement puis, à l'éape termianl, appelle la fonction ainsi construite.

Message cité 1 fois
Message édité par Joel F le 03-11-2009 à 08:06:49
Reply

Marsh Posté le 03-11-2009 à 08:13:07    

ok en faite ce que je vois pas c'est dans le cadre d'une fonction normal , si celle ci n'est jamais appelée,  à quel moment est ce qu'elle va prendre du CPU ? où à quel moment va t-elle être évaluée ?
 
je pensais qu'une fois compilée, et le code générée, si la fonction n'est jamais appelée elle ne bouffera pas un yota de CPU ?
 
C'est du gain en perf juste à la compilation ?


Message édité par Glock 17Pro le 03-11-2009 à 08:13:46

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

Marsh Posté le 03-11-2009 à 10:14:29    

l'idée, c'est : plutôt que de passer le résultat d'une fonction en guise de paramètre à une autre, tu file la fonction elle-même pour qu'elle ne soit évaluée que si on a effectivement besoin du résultat.
 
Dans le cas opposé, tu aurais consommé du CPU à calculer une valeur dont la fonction n'a peut-être pas besoin dans le contexte actuel des choses.


---------------
last.fm
Reply

Marsh Posté le 03-11-2009 à 19:33:19    

humm ok je crois voir le truc, par exemple :
 
drawCircle( computeSomething() )
 
drawCircle(double val )
{
if(...)
 utiliser val
else(..)
  fare autre chose
}
 
 
si on est dans le else computeSomething a été évalué pour rien...


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

Marsh Posté le 03-11-2009 à 19:36:06    

je suis preneur d'un meilleur exemple


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

Marsh Posté le 03-11-2009 à 20:58:15    

Joel F a écrit :

L'idée est de créée une representation du code sous forme transportable qui n'est pas évalué.


 
c'est ça en faite oui  :jap:
 
mais dans le cas d'une fonction qui prend en param une autre fonction quelle est l'avantage de ce type de technique par rapport à un bête pointeur sur fonction?


Message édité par Glock 17Pro le 03-11-2009 à 21:00:19

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

Marsh Posté le 03-11-2009 à 21:36:12    

c'est générique, typée et ca permet de faire des optimisation au site d'appel ce que empeche le passage de pointeur de fonction

Reply

Marsh Posté le 03-11-2009 à 22:09:54    

1) ok ça fait des raisons, t'aurais un exemple en tête pour le coup des optimistion au site d'appel please
2) et avec le support des lambad dans C++0X phoenix aura encore un intérêt ?

Message cité 1 fois
Message édité par Glock 17Pro le 04-11-2009 à 00:14:42

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

Marsh Posté le 04-11-2009 à 06:54:29    

Glock 17Pro a écrit :


2) et avec le support des lambad dans C++0X phoenix aura encore un intérêt ?


Franchement t'as vu la syntaxe des lambda en 0x ? Même Douglas Gregor se demande pourquoi on a accepté cette proposal avec cette syntaxe.
Autre avantage de phoenix, tu peut introspecter l'AST que tu viens de créer

Reply

Marsh Posté le 04-11-2009 à 07:55:06    

je sais pas perso la syntaxe m'a pas choqué


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

Marsh Posté le 04-11-2009 à 08:12:54    

Personellement je préfére :

Code :
  1. std::for_each(someList.begin(), someList.end(), ref(total) += _1);


à

Code :
  1. std::for_each(someList.begin(), someList.end(), [&total](int x) { total += x; });


Reply

Marsh Posté le 04-11-2009 à 21:36:33    

- j'aurais envie de dire que 2) est plus en homogénie avec la syntaxe du reste de langage
- faut voir les perfs aussi


Message édité par Glock 17Pro le 04-11-2009 à 21:40:21

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

Marsh Posté le 04-11-2009 à 21:39:56    

y a pas de différence.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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