Différence entre C ++ 11 std :: bind et boost :: bind

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