La différence entre le C++11 std::bind et boost::bind
Quelle est la différence entre les deux? Ou suis-je sûr de remplacer chaque occurrence de boost::bind
par std::bind
dans mon code et, ainsi, supprimer la dépendance sur un coup de pouce?
- Je crois
std::bind
était assez bien copié à partir deboost::bind
quand ils sont arrivés avec C++11, comme avec pas mal d'autres choses. - La question est à propos du "à peu près" bien. Certaines des choses qui ont été levées à partir de Boost, des modifications mineures ont été apportées.
Vous devez vous connecter pour publier un commentaire.
boost::bind
a surchargé les opérateurs relationnels,std::bind
ne pas.boost::bind
prise en charge non par défaut de conventions d'appel,std::bind
n'est pas garanti (bibliothèque standard implémentations peuvent offrir cela comme une extension).boost::bind
fournit un mécanisme direct pour permettre un empêcher désireux d'évaluation de imbriquée lier les expressions (boost::protéger
),std::bind
ne le fait pas. (Cela dit, on peut utiliserboost::protect
avecstd::bind
si ils le veulent, ou trivialement reproduire à leur propre compte.)std::bind
fournit un mécanisme direct, afin de permettre de traiter n'importe quel utilisateur défini comme un foncteur imbriquée lier expression afin de force désireux d'évaluation (std::is_bind_expression
: [func.bind.isbind]/1, [func.bind.lier]/10),boost::bind
ne pas.D'ailleurs plusieurs différences citées dans les autres réponses, voici deux autres différences:
boost::bind
semble traiter avec surcharge des noms de fonction dans certaines situations, alors questd::bind
ne les traite pas de la même manière. Voir c++11 faq(à l'aide de gcc 4.7.2, lib boost version 1_54)
Donc, si vous suffit de remplacer tous les
boost::bind
avecstd::bind
, votre construction pourrait se casser.std::bind
peut parfaitement se lier à c++11 lambda types, alors queboost::bind
que de stimuler 1.54 semble exiger la saisie de l'utilisateur (sauf si return_type est défini). Voir stimuler la doc(à l'aide de gcc 4.7.2, lib boost version 1_54)
Donc, si vous avez simplement remplacé tous les
std::bind
avecboost::bind
, votre construction peut aussi rompre.En plus de la liste ci-dessus, boost::bind a un important point d'extension: get_pointer() fonction qui permet d'intégrer boost::bind avec le smart pointeur, par exemple. ATL::CComPtr etc.
http://www.boost.org/doc/libs/1_49_0/libs/bind/mem_fn.html#get_pointer
Comme un résultat, avec boost::bind vous pouvez également lier un weak:
http://lists.boost.org/Archives/boost/2012/01/189529.php
INVOKE
fonctionnalité dans le standard fonctionne avec n'importe quel pointeur intelligent que le soutienoperator*
Je n'ai pas la réponse mais
std::bind
utilisera variadic templates plutôt que des listes de paramètres.Les espaces réservés sont en
std::placeholders
comme dansstd::placeholders::_1
plutôt que l'espace de noms global.Je l'alias de l'espace de noms de stdph avec
Mis à part que je n'ai eu aucun problème de mise à jour de C++11
boost::bind
directement ou indirectement.