C'è qualche differenza tra i due? O sono sicuro di sostituire ogni occorrenza di boost::bind
con std::bind
nel mio codice e quindi rimuovere la dipendenza da Boost?Differenza tra C++ 11 std :: bind e boost :: bind
risposta
boost::bind
has overloaded relational operators,std::bind
non lo fa.non è garantito a (le implementazioni di libreria standard possono offrire questo come un'estensione).
boost::bind
fornisce un meccanismo diretto a permettere di prevenire valutazione desiderosi di espressioni nidificate bind (boost::protect
),std::bind
non lo fa. (Detto questo, si può usareboost::protect
constd::bind
se vogliono, o banalmente reimplementare da soli.)std::bind
fornisce un meccanismo diretto a consentire di trattare qualsiasi funtore definito dall'utente come espressione bind nidificato al fine di force valutazione stimolante (std::is_bind_expression
: [func.bind.isbind]/1, [func.bind.bind]/10),boost::bind
no.
Non ho la risposta completa ma std::bind
utilizzerà modelli variadic anziché elenchi di parametri.
I segnaposto sono in std::placeholders
come in std::placeholders::_1
anziché lo spazio dei nomi globale.
ho alias lo spazio dei nomi per stdph con
namespace stdph=std::placeholders;
A parte che non ho avuto problemi l'aggiornamento a C++ 11
Durante il porting di boost :: codice di bind che utilizza segnaposti, aggiungendo "using namespace std :: placeholders;" nella parte superiore del file mette i segnaposto nello spazio dei nomi globale. Molto maneggevole. – goertzenator
il problema è che quando si esegue il porting di solito si finisce con il boost bind che ancora lo blocca, in qualche modo si finisce e si finisce con lo standard e si aumentano i segnaposto. – 111111
Dipende dal progetto che immagino. Ho rimosso meccanicamente tutte le mie funzioni boost.hpp e bind.hpp da un progetto di dimensioni discrete con sed e la direttiva namespace di cui sopra ha funzionato bene. Se hai un bind di potenziamento in un'intestazione che non puoi cambiare, vedo come le cose potrebbero diventare brutte. – goertzenator
Oltre elencati sopra, boost :: bind ha un importante punto di estensione: get_pointer() funzione che permette di integrare boost :: bind con qualsiasi puntatore intelligente, ad es. ATL :: CComPtr ecc http://www.boost.org/doc/libs/1_49_0/libs/bind/mem_fn.html#get_pointer
Di conseguenza, con boost :: bind è anche possibile associare un weak_ptr: http://lists.boost.org/Archives/boost/2012/01/189529.php
La funzionalità 'INVOKE' nello standard funziona con qualsiasi puntatore intelligente che supporta l'operatore' ' –
Oltre alle molte differenze citate sulle altre risposte, qui ci sono altre due differenze:
boost::bind
sembra a che fare con i nomi delle funzioni sovraccarico in alcune situazioni, mentrestd::bind
non tratta con loro nello stesso modo. Vedi c++11 faq
(usando gcc 4.7.2, aumentare la versione lib 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
Quindi, se semplicemente sostituito tutti boost::bind
con std::bind
, la build potrebbe rompersi.
std::bind
può senza legarsi a C++ 11 tipi lambda, mentreboost::bind
come di spinta 1.54 sembra richiedere l'input dell'utente (a meno che non sia definito return_type). Vedi boost doc
(usando gcc 4.7.2, aumentare la versione lib 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);
Quindi, se semplicemente sostituito tutti std::bind
con boost::bind
, la build potrebbe anche rompersi.
- 1. Dovrei vedere differenze significative tra std :: bind e boost :: bind?
- 2. Qual è la differenza tra Boost :: bind e Boost Phoenix :: bind?
- 3. Passando da boost :: bind a std :: bind: errore
- 4. C++ std :: bind
- 5. boost :: bind con membri protetti e contesto
- 6. Visual Studio 2010 e boost :: bind
- 7. Emulazione std :: bind in C
- 8. Differenza tra Binding e x: Bind
- 9. Differenza nella capacità tra fmap e bind?
- 10. Differenza tra .bind e altri eventi
- 11. std :: bind e spedizioni perfetto
- 12. std :: bind e riferimento rvalue
- 13. std :: bind to std :: function?
- 14. Se std :: bind è compatibile con boost :: asio?
- 15. Informazioni su std :: function e std :: bind
- 16. Come utilizzare le funzioni lambda con boost :: bind/std :: bind in VC++ 2010?
- 17. Differenza tra std :: asincrono e std :: bind quando l'involucro rvalue riferimento lambda
- 18. È sicuro usare std :: bind con boost :: signals2?
- 19. Passa rvalues tramite std :: bind
- 20. boost :: bind e << operatore in C++
- 21. Aiutare a capire boost :: bind argomenti segnaposto
- 22. C++ 11 numeri casuali e std :: bind interagiscono in modo inaspettato
- 23. Qual è la differenza tra `@ Bind` e` @ BindView` in butterknife?
- 24. qual è la differenza tra "call/apply" e "bind"
- 25. Spring MVC: Differenza tra molla: bind e forma: modulo
- 26. Qual è la differenza tra spring: bind e form: errori?
- 27. Laravel Differenza tra app-> bind` e `app-> singleton`?
- 28. Boost read_json e C++ 11
- 29. C++ 11 std :: shared_ptr + boost :: serializzazione
- 30. Come combinare l'uso di std :: bind con std :: shared_ptr
Credo che 'std :: bind' sia stato copiato da' boost :: bind' quando sono usciti con C++ 11, come con molte altre cose. – chris
La domanda riguarda comunque la parte "praticamente". Con alcune delle cose che sono state rimosse da Boost, sono state apportate modifiche minori. – jalf