[boost] Parcourir une map de shared_ptr via for_each & bind
10 réponses
Stephane Wirtel
Bonjour à tous,
Voici quelques jours que j'essaie de comprendre boost::bind,
pour cela, j'ai réalisé un petit exercice à base de vector de pointeur
d'instance, et l'exemple semblait concluant, jusqu'à ce que je commence
à utiliser une map comme container.
Voici le code que j'ai écrit, mais je n'arrive pas à résoudre mon
problème de compilation. Je cherche après un indice pour arriver à mon but.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Michael DOUBEZ
Bonjour à tous,
Voici quelques jours que j'essaie de comprendre boost::bind, pour cela, j'ai réalisé un petit exercice à base de vector de pointeur d'instance, et l'exemple semblait concluant, jusqu'à ce que je commence à utiliser une map comme container.
Voici le code que j'ai écrit, mais je n'arrive pas à résoudre mon problème de compilation. Je cherche après un indice pour arriver à mon but.
Voici quelques jours que j'essaie de comprendre boost::bind,
pour cela, j'ai réalisé un petit exercice à base de vector de pointeur
d'instance, et l'exemple semblait concluant, jusqu'à ce que je commence
à utiliser une map comme container.
Voici le code que j'ai écrit, mais je n'arrive pas à résoudre mon
problème de compilation. Je cherche après un indice pour arriver à mon but.
Voici quelques jours que j'essaie de comprendre boost::bind, pour cela, j'ai réalisé un petit exercice à base de vector de pointeur d'instance, et l'exemple semblait concluant, jusqu'à ce que je commence à utiliser une map comme container.
Voici le code que j'ai écrit, mais je n'arrive pas à résoudre mon problème de compilation. Je cherche après un indice pour arriver à mon but.
Peut être NAME_ devrait être renvoyé en const ref ? const _TYPE& _NAME() const { return m##_NAME; } Concernant les macros, c'était à la va-vite pour pouvoir me préoccuper
surtout sur l'utilisation de boost::bind
Pour autant que je sache, tu ne peux pas faire de bind sur les variables membres. Il te faut un accessor: D'après l'ouvrage "Beyond the C++ Standard Library - An introduction to
Boost" de Björn Karlsson, il est tout à fait possible de le faire sans aucuns soucis.
D'ailleurs si tu enlèves mon shared_ptr pour le data_type de ma map, cela fonctionne sans problèmes.
Peut être NAME_ devrait être renvoyé en const ref ?
const _TYPE& _NAME() const { return m##_NAME; }
Concernant les macros, c'était à la va-vite pour pouvoir me préoccuper
surtout sur l'utilisation de boost::bind
Pour autant que je sache, tu ne peux pas faire de bind sur les variables
membres. Il te faut un accessor:
D'après l'ouvrage "Beyond the C++ Standard Library - An introduction to
Boost" de Björn Karlsson, il est tout à fait possible de le faire sans
aucuns soucis.
D'ailleurs si tu enlèves mon shared_ptr pour le data_type de ma map,
cela fonctionne sans problèmes.
Peut être NAME_ devrait être renvoyé en const ref ? const _TYPE& _NAME() const { return m##_NAME; } Concernant les macros, c'était à la va-vite pour pouvoir me préoccuper
surtout sur l'utilisation de boost::bind
Pour autant que je sache, tu ne peux pas faire de bind sur les variables membres. Il te faut un accessor: D'après l'ouvrage "Beyond the C++ Standard Library - An introduction to
Boost" de Björn Karlsson, il est tout à fait possible de le faire sans aucuns soucis.
D'ailleurs si tu enlèves mon shared_ptr pour le data_type de ma map, cela fonctionne sans problèmes.
Peut être NAME_ devrait être renvoyé en const ref ? const _TYPE& _NAME() const { return m##_NAME; } Concernant les macros, c'était à la va-vite pour pouvoir me préoccuper
surtout sur l'utilisation de boost::bind
Pour autant que je sache, tu ne peux pas faire de bind sur les variables membres. Il te faut un accessor: D'après l'ouvrage "Beyond the C++ Standard Library - An introduction to
Boost" de Björn Karlsson, il est tout à fait possible de le faire sans aucuns soucis.
Ok. C'est bon à savoir.
D'ailleurs si tu enlèves mon shared_ptr pour le data_type de ma map, cela fonctionne sans problèmes.
Tu veux dire en utilisant un pointeur ?
Par contre, peux-tu m'expliquer un peu l'idée derrière le second code que tu m'as fait parvenir ?
Rien de bien extraordinaire, le binding est fait en deux temps au lieu d'un. J'ai pas une grande habitude de boost.bind alors des fois je suis prudent dans son utilisation.
Michael
Peut être NAME_ devrait être renvoyé en const ref ?
const _TYPE& _NAME() const { return m##_NAME; }
Concernant les macros, c'était à la va-vite pour pouvoir me préoccuper
surtout sur l'utilisation de boost::bind
Pour autant que je sache, tu ne peux pas faire de bind sur les
variables membres. Il te faut un accessor:
D'après l'ouvrage "Beyond the C++ Standard Library - An introduction to
Boost" de Björn Karlsson, il est tout à fait possible de le faire sans
aucuns soucis.
Ok. C'est bon à savoir.
D'ailleurs si tu enlèves mon shared_ptr pour le data_type de ma map,
cela fonctionne sans problèmes.
Tu veux dire en utilisant un pointeur ?
Par contre, peux-tu m'expliquer un peu l'idée derrière le second code
que tu m'as fait parvenir ?
Rien de bien extraordinaire, le binding est fait en deux temps au lieu
d'un. J'ai pas une grande habitude de boost.bind alors des fois je suis
prudent dans son utilisation.
Peut être NAME_ devrait être renvoyé en const ref ? const _TYPE& _NAME() const { return m##_NAME; } Concernant les macros, c'était à la va-vite pour pouvoir me préoccuper
surtout sur l'utilisation de boost::bind
Pour autant que je sache, tu ne peux pas faire de bind sur les variables membres. Il te faut un accessor: D'après l'ouvrage "Beyond the C++ Standard Library - An introduction to
Boost" de Björn Karlsson, il est tout à fait possible de le faire sans aucuns soucis.
Ok. C'est bon à savoir.
D'ailleurs si tu enlèves mon shared_ptr pour le data_type de ma map, cela fonctionne sans problèmes.
Tu veux dire en utilisant un pointeur ?
Par contre, peux-tu m'expliquer un peu l'idée derrière le second code que tu m'as fait parvenir ?
Rien de bien extraordinaire, le binding est fait en deux temps au lieu d'un. J'ai pas une grande habitude de boost.bind alors des fois je suis prudent dans son utilisation.
Michael
Stephane Wirtel
Tu veux dire en utilisant un pointeur ? Oui, tout à fait.
Encore merci,
Tu veux dire en utilisant un pointeur ?
Oui, tout à fait.
Tu veux dire en utilisant un pointeur ? Oui, tout à fait.
Encore merci,
Michael DOUBEZ
Bonjour à tous,
Voici quelques jours que j'essaie de comprendre boost::bind, pour cela, j'ai réalisé un petit exercice à base de vector de pointeur d'instance, et l'exemple semblait concluant, jusqu'à ce que je commence à utiliser une map comme container.
Voici le code que j'ai écrit, mais je n'arrive pas à résoudre mon problème de compilation. Je cherche après un indice pour arriver à mon but.
Voici quelques jours que j'essaie de comprendre boost::bind,
pour cela, j'ai réalisé un petit exercice à base de vector de pointeur
d'instance, et l'exemple semblait concluant, jusqu'à ce que je commence
à utiliser une map comme container.
Voici le code que j'ai écrit, mais je n'arrive pas à résoudre mon
problème de compilation. Je cherche après un indice pour arriver à mon but.
Voici quelques jours que j'essaie de comprendre boost::bind, pour cela, j'ai réalisé un petit exercice à base de vector de pointeur d'instance, et l'exemple semblait concluant, jusqu'à ce que je commence à utiliser une map comme container.
Voici le code que j'ai écrit, mais je n'arrive pas à résoudre mon problème de compilation. Je cherche après un indice pour arriver à mon but.
Je suis truffe. Il ne doit pas y avoir de spécialisation bind()(shared_ptr<>()&)
Le code suivant fonctionne sous g++:
std::for_each( users.begin(), users.end(), boost::bind( &User::print, boost::bind(&User::SharedPtr::get,boost::bind( &User::Map::value_type::second, _1 )), boost::ref( std::cout ) ) ); 'ai essayé ton code et cela semble fonctionner sans problème.
J'ai essayé ton exemple et cela fonctionne.
boost::shared_ptr<T>() n'a pas de cast automatique vers T*.
Mais j'ai tout de même une question, si tu regardes le code qui est en commentaire, j'utilisais un User::Vector comme container, et ce code fonctionnait parfaitement sous g++. Et comme tu as pû le constater, mon User::Vector est vecteur de shared_ptr, donc, semblerait-il qu'il y ait tout ce qui est nécessaire pour résoudre ce problème de manière plus élégante ?
Je suis truffe. Il ne doit pas y avoir de spécialisation
bind()(shared_ptr<>()&)
Le code suivant fonctionne sous g++:
std::for_each(
users.begin(), users.end(),
boost::bind(
&User::print,
boost::bind(&User::SharedPtr::get,boost::bind(
&User::Map::value_type::second, _1 )),
boost::ref( std::cout )
)
);
'ai essayé ton code et cela semble fonctionner sans problème.
J'ai essayé ton exemple et cela fonctionne.
boost::shared_ptr<T>() n'a pas de cast automatique vers T*.
Mais j'ai tout de même une question, si tu regardes le code qui est en
commentaire, j'utilisais un User::Vector comme container, et ce code
fonctionnait parfaitement sous g++. Et comme tu as pû le constater, mon
User::Vector est vecteur de shared_ptr, donc, semblerait-il qu'il y ait
tout ce qui est nécessaire pour résoudre ce problème de manière plus
élégante ?
Je suis truffe. Il ne doit pas y avoir de spécialisation bind()(shared_ptr<>()&)
Le code suivant fonctionne sous g++:
std::for_each( users.begin(), users.end(), boost::bind( &User::print, boost::bind(&User::SharedPtr::get,boost::bind( &User::Map::value_type::second, _1 )), boost::ref( std::cout ) ) ); 'ai essayé ton code et cela semble fonctionner sans problème.
J'ai essayé ton exemple et cela fonctionne.
boost::shared_ptr<T>() n'a pas de cast automatique vers T*.
Mais j'ai tout de même une question, si tu regardes le code qui est en commentaire, j'utilisais un User::Vector comme container, et ce code fonctionnait parfaitement sous g++. Et comme tu as pû le constater, mon User::Vector est vecteur de shared_ptr, donc, semblerait-il qu'il y ait tout ce qui est nécessaire pour résoudre ce problème de manière plus élégante ?
Avec lambda, tu peux pas tout simplement mettre un * devant pour résoudre le problème ?
pas encore essayé, mais je n'étais qu'à boost::bind, je vais y regarder.
Merci de l'indice
Michael DOUBEZ
Merci Michael,
Je suis truffe. Il ne doit pas y avoir de spécialisation bind()(shared_ptr<>()&) boost::shared_ptr<T>() n'a pas de cast automatique vers T*.
Mais j'ai tout de même une question, si tu regardes le code qui est en commentaire, j'utilisais un User::Vector comme container, et ce code fonctionnait parfaitement sous g++. Et comme tu as pû le constater, mon User::Vector est vecteur de shared_ptr, donc, semblerait-il qu'il y ait tout ce qui est nécessaire pour résoudre ce problème de manière plus élégante ?
Je suis truffe. Il ne doit pas y avoir de spécialisation
bind()(shared_ptr<>()&)
boost::shared_ptr<T>() n'a pas de cast automatique vers T*.
Mais j'ai tout de même une question, si tu regardes le code qui est en
commentaire, j'utilisais un User::Vector comme container, et ce code
fonctionnait parfaitement sous g++. Et comme tu as pû le constater, mon
User::Vector est vecteur de shared_ptr, donc, semblerait-il qu'il y ait
tout ce qui est nécessaire pour résoudre ce problème de manière plus
élégante ?
Je suis truffe. Il ne doit pas y avoir de spécialisation bind()(shared_ptr<>()&) boost::shared_ptr<T>() n'a pas de cast automatique vers T*.
Mais j'ai tout de même une question, si tu regardes le code qui est en commentaire, j'utilisais un User::Vector comme container, et ce code fonctionnait parfaitement sous g++. Et comme tu as pû le constater, mon User::Vector est vecteur de shared_ptr, donc, semblerait-il qu'il y ait tout ce qui est nécessaire pour résoudre ce problème de manière plus élégante ?