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

  FORUM HardWare.fr
  Programmation
  C++

  ptr_fun bind2nd

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

ptr_fun bind2nd

n°1936699
Glock 17Pr​o
Posté le 31-10-2009 à 13:15:59  profilanswer
 

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

---------------
.
mood
Publicité
Posté le 31-10-2009 à 13:15:59  profilanswer
 

n°1936710
Glock 17Pr​o
Posté le 31-10-2009 à 14:21:53  profilanswer
 

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


---------------
.
n°1936714
Amonchakai
Posté le 31-10-2009 à 14:40:00  profilanswer
 

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
n°1936717
Joel F
Real men use unique_ptr
Posté le 31-10-2009 à 14:53:07  profilanswer
 

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
n°1936722
Glock 17Pr​o
Posté le 31-10-2009 à 15:58:21  profilanswer
 

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

---------------
.
n°1936763
Joel F
Real men use unique_ptr
Posté le 01-11-2009 à 11:21:01  profilanswer
 

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
n°1936768
Glock 17Pr​o
Posté le 01-11-2009 à 13:07:45  profilanswer
 

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


---------------
.
n°1936769
Joel F
Real men use unique_ptr
Posté le 01-11-2009 à 13:32:50  profilanswer
 

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
n°1936783
Glock 17Pr​o
Posté le 01-11-2009 à 15:50:05  profilanswer
 

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

---------------
.
n°1936787
Glock 17Pr​o
Posté le 01-11-2009 à 15:59:21  profilanswer
 

énorme cette librairie lambda


---------------
.
mood
Publicité
Posté le 01-11-2009 à 15:59:21  profilanswer
 

n°1936795
Glock 17Pr​o
Posté le 01-11-2009 à 16:23:46  profilanswer
 

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


---------------
.
n°1936802
Joel F
Real men use unique_ptr
Posté le 01-11-2009 à 16:52:02  profilanswer
 

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

n°1936835
Glock 17Pr​o
Posté le 01-11-2009 à 18:59:21  profilanswer
 

à terme les deux vont fusioner ?


---------------
.
n°1936847
Joel F
Real men use unique_ptr
Posté le 01-11-2009 à 19:50:49  profilanswer
 

oui on (je) travaille sur ça

n°1936848
Glock 17Pr​o
Posté le 01-11-2009 à 19:52:04  profilanswer
 

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


---------------
.
n°1936851
Joel F
Real men use unique_ptr
Posté le 01-11-2009 à 19:53:49  profilanswer
 

ouais pour comaptibilité ascendante.

n°1936893
Glock 17Pr​o
Posté le 01-11-2009 à 22:38:52  profilanswer
 

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


---------------
.
n°1936894
Joel F
Real men use unique_ptr
Posté le 01-11-2009 à 22:47:19  profilanswer
 

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
n°1936905
Glock 17Pr​o
Posté le 02-11-2009 à 01:39:45  profilanswer
 

on entends quoi par "lazy-evaluable" ?


---------------
.
n°1936910
Joel F
Real men use unique_ptr
Posté le 02-11-2009 à 08:20:44  profilanswer
 

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

n°1937126
Glock 17Pr​o
Posté le 02-11-2009 à 22:01:55  profilanswer
 

quel est le principal intérêt ?


---------------
.
n°1937127
Joel F
Real men use unique_ptr
Posté le 02-11-2009 à 22:08:28  profilanswer
 
n°1937129
Glock 17Pr​o
Posté le 02-11-2009 à 22:37:41  profilanswer
 

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
 
 


---------------
.
n°1937144
Joel F
Real men use unique_ptr
Posté le 03-11-2009 à 07:52:16  profilanswer
 

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

n°1937145
Glock 17Pr​o
Posté le 03-11-2009 à 08:00:50  profilanswer
 

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 ?


---------------
.
n°1937146
Joel F
Real men use unique_ptr
Posté le 03-11-2009 à 08:06:15  profilanswer
 

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
n°1937148
Glock 17Pr​o
Posté le 03-11-2009 à 08:13:07  profilanswer
 

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

---------------
.
n°1937175
theShockWa​ve
I work at a firm named Koslow
Posté le 03-11-2009 à 10:14:29  profilanswer
 

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
n°1937381
Glock 17Pr​o
Posté le 03-11-2009 à 19:33:19  profilanswer
 

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


---------------
.
n°1937382
Glock 17Pr​o
Posté le 03-11-2009 à 19:36:06  profilanswer
 

je suis preneur d'un meilleur exemple


---------------
.
n°1937419
Glock 17Pr​o
Posté le 03-11-2009 à 20:58:15  profilanswer
 

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

---------------
.
n°1937437
Joel F
Real men use unique_ptr
Posté le 03-11-2009 à 21:36:12  profilanswer
 

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

n°1937443
Glock 17Pr​o
Posté le 03-11-2009 à 22:09:54  profilanswer
 

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

---------------
.
n°1937470
Joel F
Real men use unique_ptr
Posté le 04-11-2009 à 06:54:29  profilanswer
 

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

n°1937478
Glock 17Pr​o
Posté le 04-11-2009 à 07:55:06  profilanswer
 

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


---------------
.
n°1937481
Joel F
Real men use unique_ptr
Posté le 04-11-2009 à 08:12:54  profilanswer
 

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; });


n°1937833
Glock 17Pr​o
Posté le 04-11-2009 à 21:36:33  profilanswer
 

- 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

---------------
.
n°1937834
Joel F
Real men use unique_ptr
Posté le 04-11-2009 à 21:39:56  profilanswer
 

y a pas de différence.

mood
Publicité
Posté le   profilanswer
 


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

  ptr_fun bind2nd

 

Sujets relatifs
Plus de sujets relatifs à : ptr_fun bind2nd


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