OVH Cloud OVH Cloud

Argument bind1st

11 réponses
Avatar
Marc Boyer
Bonjour,

je me bats un peu avec bind1st. Est-ce qu'on peut lui passer
une fonction, ou il faut forcément un objet avec une méthode
operator() ?

D'ailleurs mon TC++PL (VF, 4ème édition) est assez muet sur
bind1st...

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

10 réponses

1 2
Avatar
Jean-Marc Bourguet
Marc Boyer writes:

je me bats un peu avec bind1st. Est-ce qu'on peut lui passer
une fonction, ou il faut forcément un objet avec une méthode
operator() ?


Il faut forcément un objet avec un membre operator() et les
typedefs qui vont bien pour les types des paramètres et de
la valeur retournée.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Loïc Joly
Bonjour,

je me bats un peu avec bind1st. Est-ce qu'on peut lui passer
une fonction, ou il faut forcément un objet avec une méthode
operator() ?

D'ailleurs mon TC++PL (VF, 4ème édition) est assez muet sur
bind1st...


Si ton but est d'utiliser quelquechose, et non d'enseigner le C++
standard, je te conseille de regarder boost::bind qui est à mon sens
bien plus simple et puissant que les adaptateurs de la STL.

--
Loïc

Avatar
Marc Boyer
Loïc Joly wrote:
Bonjour,

je me bats un peu avec bind1st. Est-ce qu'on peut lui passer
une fonction, ou il faut forcément un objet avec une méthode
operator() ?

D'ailleurs mon TC++PL (VF, 4ème édition) est assez muet sur
bind1st...


Si ton but est d'utiliser quelquechose, et non d'enseigner le C++
standard, je te conseille de regarder boost::bind qui est à mon sens
bien plus simple et puissant que les adaptateurs de la STL.


Disons que je me suis décidé à faire un code en utilisant des
bouts de la STL que j'avais justqu'à présent ignoré (find_if
en l'occurence, et puis bind1st pour voir...).
Mais j'ai la flemme de me lancer dans boost là. Ce sera
pour la prochaine fois je pense. En plus, j'aime bien avoir
un bouquin pour entrer dans un truc comme ça et pas juste
une doc en ligne, et j'en ai pas trouvé (j'ai vu Boost Graph
et C++ Metaprogramming, mais rien de plus basique).

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


Avatar
Marc Boyer
Jean-Marc Bourguet wrote:
Marc Boyer writes:

je me bats un peu avec bind1st. Est-ce qu'on peut lui passer
une fonction, ou il faut forcément un objet avec une méthode
operator() ?


Il faut forcément un objet avec un membre operator() et les
typedefs qui vont bien pour les types des paramètres et de
la valeur retournée.


Quels typedef ? J'ai sous les yeux un bouquin de M. Fontaine
sur la STL, et il n'en parle pas.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


Avatar
Michel Michaud
Dans le message d7osit$vo$,
Jean-Marc Bourguet wrote:
Marc Boyer writes:

je me bats un peu avec bind1st. Est-ce qu'on peut lui passer
une fonction, ou il faut forcément un objet avec une méthode
operator() ?


Il faut forcément un objet avec un membre operator() et les
typedefs qui vont bien pour les types des paramètres et de
la valeur retournée.


Quels typedef ? J'ai sous les yeux un bouquin de M. Fontaine
sur la STL, et il n'en parle pas.


Pas vraiment nécessaire pour les bind, mais il les faut pour
pouvoir appliquer not1 par exemple. Alors on fait simplement
dériver de unary_function ou binary_function pour les avoir
au cas où...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



Avatar
Jean-Marc Bourguet
Marc Boyer writes:

Jean-Marc Bourguet wrote:
Marc Boyer writes:

je me bats un peu avec bind1st. Est-ce qu'on peut lui passer
une fonction, ou il faut forcément un objet avec une méthode
operator() ?


Il faut forcément un objet avec un membre operator() et les
typedefs qui vont bien pour les types des paramètres et de
la valeur retournée.


Quels typedef ? J'ai sous les yeux un bouquin de M. Fontaine
sur la STL, et il n'en parle pas.


Ceux necessaires pour binder1st, le type retourne par bind1st.

template <class Operation>
class binder1st :
public unary_function<typename Operation::second_argument_type,
typename Operation::result_type>
{
protected:
Operation op;
typename Operation::first_argument_type value;
public:
binder1st(Operation const& x,
typename Operation::first_argument_type const& y);
typename Operation::result_type
operator()(typename Operation::second_argument_type const& x);
};

template <class Operation, class T>
binder1st<Operation> bind1st(Operation const& op, T const& x);

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
kanze
Marc Boyer wrote:
Loïc Joly wrote:

je me bats un peu avec bind1st. Est-ce qu'on peut lui
passer une fonction, ou il faut forcément un objet avec une
méthode operator() ?

D'ailleurs mon TC++PL (VF, 4ème édition) est assez muet sur
bind1st...


Si ton but est d'utiliser quelquechose, et non d'enseigner
le C++ standard, je te conseille de regarder boost::bind qui
est à mon sens bien plus simple et puissant que les
adaptateurs de la STL.


Disons que je me suis décidé à faire un code en utilisant
des bouts de la STL que j'avais justqu'à présent ignoré
(find_if en l'occurence, et puis bind1st pour voir...).
Mais j'ai la flemme de me lancer dans boost là. Ce sera pour
la prochaine fois je pense. En plus, j'aime bien avoir un
bouquin pour entrer dans un truc comme ça et pas juste une doc
en ligne, et j'en ai pas trouvé (j'ai vu Boost Graph et C++
Metaprogramming, mais rien de plus basique).


Je ne suis pas sûr ce que tu veux dire par « se lancer dans
boost ». Boost n'est pas un monolithe, et il n'y a aucune raison
à se lancer à l'apprendre tout. En revanche, certaines
fonctionalités sont incontournable : tu ne vas quand même pas
implémenter toi-même des expressions rationnelles, et je doute
que tu en trouves de mieux que chez Boost. En ce qui concerne
boost::bind, les std::bind* ne fonctionnent pas dans la plupart
des cas réels, et sont assez lourd à mettre en oeuvre.
Boost::bind marche, et est assez simple à utiliser. Si je
n'avais pas à supporter Sun CC, je n'hésiterais pas un instant.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
Marc Boyer
wrote:
Disons que je me suis décidé à faire un code en utilisant
des bouts de la STL que j'avais justqu'à présent ignoré
(find_if en l'occurence, et puis bind1st pour voir...).
Mais j'ai la flemme de me lancer dans boost là. Ce sera pour
la prochaine fois je pense. En plus, j'aime bien avoir un
bouquin pour entrer dans un truc comme ça et pas juste une doc
en ligne, et j'en ai pas trouvé (j'ai vu Boost Graph et C++
Metaprogramming, mais rien de plus basique).


Je ne suis pas sûr ce que tu veux dire par « se lancer dans
boost ». Boost n'est pas un monolithe, et il n'y a aucune raison
à se lancer à l'apprendre tout.


Non, mais par où commencer ? Comment savoir quand j'ai
un problème qu'il existe quelque chose chez boost qui
aide à le traiter ?

En revanche, certaines
fonctionalités sont incontournable : tu ne vas quand même pas
implémenter toi-même des expressions rationnelles, et je doute
que tu en trouves de mieux que chez Boost.


sed/awk :-)
Plus simplement, pour reprendre l'exemple d'un code que je
fais actuellement, pour lire des adresses IPv4 (genre
147.14.248.12), je me contente d'un stream, genre

val= 0;
for(int i=0;i<4;++i){
unsigned int octet;
in >> octet;
assert( in && (octet <= 255 ) );
val+= octet;
if (i != 3){
val= val<<8;
char c;
in >> c;
assert( in && c == '.' );
}
}

On doit pouvoir faire mieux avec boost. Mais pour le
savoir (hormis les infos distillées ici jour après jour),
il faut aller sur le site WEB. Je vois un truc "parsing".
Je me dis que c'est ce que je fais. Et là, je vois "spirit"
qui gère les grammaires LL1. Bon, après 10mn à parcourir la
doc, je me dis que c'est peut-être le marteau pour écraser
la mouche.
Si je suis curieux, je vois "text processing", je tombe
sur regex. OK, je commence à voir que je peux vérifier
que la ligne correspond bien grace aux premiers exemples.

En ce qui concerne
boost::bind, les std::bind* ne fonctionnent pas dans la plupart
des cas réels, et sont assez lourd à mettre en oeuvre.
Boost::bind marche, et est assez simple à utiliser. Si je
n'avais pas à supporter Sun CC, je n'hésiterais pas un instant.


OK
La prochaine fois que j'ai un bind à faire, je regarderais.


Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


Avatar
Michel Michaud
Dans le message d7muq5$8pk$,
je me bats un peu avec bind1st. Est-ce qu'on peut lui passer
une fonction, ou il faut forcément un objet avec une méthode
operator() ?


Personne ne te l'a dit, alors je vais ajouter un détail...

En principe, il faut une fonction objet, mais tu peux passer
une fonction, en la convertissant avec ptr_fun !

bool F(int, int) { ... }

... bind1st(ptr_fun(F), 0) ...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Marc Boyer
Michel Michaud wrote:
Dans le message d7muq5$8pk$,
je me bats un peu avec bind1st. Est-ce qu'on peut lui passer
une fonction, ou il faut forcément un objet avec une méthode
operator() ?


Personne ne te l'a dit, alors je vais ajouter un détail...

En principe, il faut une fonction objet, mais tu peux passer
une fonction, en la convertissant avec ptr_fun !

bool F(int, int) { ... }

... bind1st(ptr_fun(F), 0) ...


Super !

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


1 2