Y a-t-il une différence entre les deux? Ou suis-je sûr de remplacer toutes les occurrences de boost::bind
par std::bind
dans mon code et de supprimer ainsi la dépendance à Boost?
boost::bind
a surchargé les opérateurs relationnels , mais pas std::bind
.
boost::bind
prend en charge les conventions d’appel autres que celles par défaut , std::bind
n’est pas garanti (les implémentations de bibliothèque standard peuvent proposer cela comme une extension).
boost::bind
fournit un mécanisme direct pour empêcher une évaluation rapide des expressions de liaison nestedes ( boost::protect
), contrairement à std::bind
. (Cela dit, on peut utiliser boost::protect
avec std::bind
si elles le veulent, ou le réimplémenter de manière sortingviale).
std::bind
fournit un mécanisme direct permettant de traiter n’importe quel foncteur défini par l’utilisateur comme une expression de liaison nestede afin de forcer une évaluation std::is_bind_expression
( std::is_bind_expression
: [func.bind.isbind] / 1, [func.bind.bind ] / 10), boost::bind
ne le fait pas.
Outre les nombreuses différences citées sur les autres réponses, voici deux autres différences:
boost::bind
semble traiter les noms de fonctions surchargés dans certaines situations, alors que std::bind
ne les traite pas de la même manière. Voir c ++ 11 faq (en utilisant gcc 4.7.2, boost lib version 1_54)
void foo(){} void foo(int i){} auto badstd1 = std::bind(foo); //comstack error: no matching function for call to bind() auto badstd2 = std::bind(foo, 1); //comstack error: no matching function for call to bind( ) auto std1 = std::bind(static_cast(foo)); //comstacks ok auto std2 = std::bind(static_cast(foo), 1); //comstacks ok auto boost1 = boost::bind(foo, 1); //comstacks ok auto boost2 = boost::bind(foo); //comstacks ok
Donc, si vous avez simplement remplacé tous les boost::bind
par std::bind
, votre build pourrait se casser.
std::bind
peut se lier de manière transparente aux types lambda c ++ 11, alors que boost::bind
partir de boost 1.54 semble nécessiter une entrée de l’utilisateur (sauf si return_type est défini). Voir boost doc (en utilisant gcc 4.7.2, boost lib version 1_54)
auto fun = [](int i) { return i;}; auto stdbound = std::bind(fun, std::placeholders::_1); stdbound(1); auto boostboundNaive = boost::bind(fun, _1); //comstack error. // error: no type named 'result_type' ... auto boostbound1 = boost::bind(fun, _1); //ok boostbound1(1); auto boostbound2 = boost::bind(boost::type (), fun, _1); //ok boostbound2(1);
Donc, si vous avez simplement remplacé tous les std::bind
par boost::bind
, votre build pourrait également se briser.
Outre la liste ci-dessus, boost :: bind a un point d’extension important: la fonction get_pointer () qui permet d’intégrer boost :: bind avec n’importe quel pointeur intelligent, par exemple. ATL :: CComPtr etc. http://www.boost.org/doc/libs/1_49_0/libs/bind/mem_fn.html#get_pointer
En conséquence, avec boost :: bind, vous pouvez également lier un faibles_ptr: http://lists.boost.org/Archives/boost/2012/01/189529.php
Je n’ai pas la réponse complète, mais std::bind
utilisera des modèles variadiques plutôt que des listes de parameters.
Les espaces réservés sont dans std::placeholders
comme dans std::placeholders::_1
plutôt que dans l’espace de noms global.
J’appelle le namespace à stdph avec
namespace stdph=std::placeholders;
En dehors de cela, je n’ai eu aucun problème pour mettre à jour C ++ 11