Gibt es einen Unterschied zwischen den beiden? Oder bin ich sicher, jedes Auftreten von boost::bind
durch std::bind
in meinem Code zu ersetzen und dadurch die Abhängigkeit von Boost zu entfernen?Unterschied zwischen C++ 11 Std :: Bind und Boost :: Bind
Antwort
boost::bind
has overloaded relational operators, tutstd::bind
nicht.boost::bind
supports non-default calling conventions wirdstd::bind
nicht garantiert (Standardbibliothek Implementierungen dies als Erweiterung bieten kann).boost::bind
einen direkten Mechanismus stellt eifrige Auswertung von verschachteltem bind Ausdrücke (boost::protect
), damit einer bis verhindern,std::bind
nicht. (Das heißt, man kannboost::protect
mitstd::bind
verwenden, wenn sie wünschen, oder reimplementieren sie trivialer Weise auf ihre eigenen.)std::bind
einen direkten Mechanismus bereitstellt, um jeden Benutzer definiert Funktors als verschachtelte bind Expression zu erlauben, einen zu behandeln, um force eifrige Bewertung (std::is_bind_expression
: [func.bind.isbind]/1, [func.bind.bind]/10),boost::bind
nicht.
Ich habe nicht die vollständige Antwort, aber std::bind
wird variadic Vorlagen anstelle von Parameterlisten verwenden. Die Platzhalter sind in std::placeholders
wie in std::placeholders::_1
und nicht im globalen Namespace.
ich den Namespace Alias aus mit
namespace stdph=std::placeholders;
Apart stdph, dass ich die Aktualisierung keine Probleme mussten C 11 ++
Wenn Sie vorhandenen boost :: bind-Code, der Platzhalter verwendet, portieren, fügen Sie "using namespace std :: placeholders;" Am Anfang der Datei werden die Platzhalter in den globalen Namespace eingefügt. Sehr praktisch. – goertzenator
Das Problem ist, wenn Portierung Sie in der Regel mit Boost binden noch rangeln es, s Weg durch irgendwie und Sie am Ende mit dem Standard und boosten Platzhalter. – 111111
Es kommt auf das Projekt an, denke ich. Ich habe alle meine Boost-Funktion mechanisch entfernt. Hpp und bind.hpp enthalten ein Projekt mit anständiger Größe und sed, und die obige Namespace-Direktive hat gut funktioniert. Wenn Sie eine Boost-Bindung in einem Header haben, den Sie nicht ändern können, sehe ich, wie die Dinge hässlich werden können. – goertzenator
Neben den oben aufgeführten boost :: bind hat eine wichtige Erweiterung Punkt: get_pointer() Funktion, die mit jedem Smart Pointer boost :: bind ermöglicht die Integration, beispielsweise. ATL :: CComPtr usw. http://www.boost.org/doc/libs/1_49_0/libs/bind/mem_fn.html#get_pointer
Als Ergebnis mit boost :: bind Sie auch eine weak_ptr binden können: http://lists.boost.org/Archives/boost/2012/01/189529.php
Die "INVOKE" -Funktionalität im Standard funktioniert mit jedem intelligenten Zeiger, der 'operator *' unterstützt –
Neben den verschiedenen auf den anderen Antworten zitiert Unterschiede, hier sind zwei weitere Unterschiede:
boost::bind
scheint mit überladenen Funktionsnamen in manchen Situationen zu bewältigen, währendstd::bind
nicht mit ihnen in der gleichen Art und Weise befasst. Siehe c++11 faq
(mit gcc 4.7.2, steigern lib Version 1_54)
void foo(){}
void foo(int i){}
auto badstd1 = std::bind(foo);
//compile error: no matching function for call to bind(<unresolved overloaded function type>)
auto badstd2 = std::bind(foo, 1);
//compile error: no matching function for call to bind(<unresolved overloaded function type>)
auto std1 = std::bind(static_cast<void(*)()>(foo)); //compiles ok
auto std2 = std::bind(static_cast<void(*)(int)>(foo), 1); //compiles ok
auto boost1 = boost::bind(foo, 1); //compiles ok
auto boost2 = boost::bind(foo); //compiles ok
Also, wenn Sie einfach alle boost::bind
mit std::bind
ersetzt, könnte Ihr Build brechen. nahtlos binden an C++ 11 Lambda-Typen
std::bind
kann, währendboost::bind
als Boost 1.54 scheint eine Eingabe vom Benutzer zu erfordern (es sei denn, Rückgabetyp ist definiert). Siehe boost doc
(mit gcc 4.7.2, steigern 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); //compile error.
// error: no type named ‘result_type’ ...
auto boostbound1 = boost::bind<int>(fun, _1); //ok
boostbound1(1);
auto boostbound2 = boost::bind(boost::type<int>(), fun, _1); //ok
boostbound2(1);
Also, wenn Sie einfach alle std::bind
mit boost::bind
ersetzt, könnte Ihr Build auch brechen.
- 1. boost :: bind und std ::
- 2. boost :: bind und Klassenmitgliedsfunktion
- 3. Sollte ich signifikante Unterschiede zwischen Std :: Bind und Boost :: Bind sehen?
- 4. Was ist der Unterschied zwischen Boost :: bind und Boost Phoenix :: bind?
- 5. Umzug von boost :: bind zu std :: bind: Kompilierfehler
- 6. Unterschied zwischen jquery bind
- 7. C++ 11 Zufallszahlen und std :: bind interagieren in unerwarteten Weise
- 8. std :: bind und winsock.h Bind Verwirrung
- 9. std :: bind std :: function?
- 10. boost :: bind mit geschützten Elementen und Kontext
- 11. Visual Studio 2010 und boost :: bind
- 12. C++ std :: bind rebind Funktion
- 13. emulieren std :: bind in C
- 14. wie boost :: function und boost :: bind arbeiten
- 15. C++ 11: std :: bind stürzt ab mit Lambda
- 16. Unterschied zwischen Bind, Apply und Call-Methode?
- 17. Unterschied zwischen .bind und anderen Veranstaltungen
- 18. Unterschied zwischen Bindung und x: Bind
- 19. Boost-Anfänger, boost :: bind Alptraum
- 20. C++ 11 Platzhalter mit Boost
- 21. std :: bind und überladene Funktion
- 22. std :: bind und rvalue Referenz
- 23. boost :: bind mit überladenen Funktionen?
- 24. std :: function und std :: bind Verhalten
- 25. Understanding std :: function und std :: bind
- 26. std :: Bind Argument Kopierverhalten
- 27. std :: bind der Klassenmemberfunktion
- 28. boost :: bind, boost :: asio, boost :: thread und classes
- 29. Verwendung std :: bind innerhalb std :: for_each
- 30. C++ std :: bind das Objekt lebendig halten
Ich glaube, 'std :: bind' wurde ziemlich viel von' boost :: bind' kopiert, als sie mit C++ 11 herauskamen, wie mit vielen anderen Dingen. – chris
Die Frage bezieht sich auf den "ziemlich viel" Teil. Mit einigen der Dinge, die von Boost entfernt wurden, wurden kleinere Änderungen vorgenommen. – jalf