2011-01-13 14 views
29

Inizialmente pensavo fossero tutti uguali, ma si è rivelato sbagliato. Quindi qualcuno può spiegare brevemente le differenze tra questi tre? Per esempio:Quali sono le differenze tra std, tr1 e boost (come namespace e/o librerie)?

  1. std::bind (più nuovo, la prossima generazione di C++)
  2. std::tr1::bind (vecchia, l'estensione di C++ std)
  3. boost::bind (biblioteca completamente separato)

o std::shared_ptr, std::tr1::shared_ptr e boost::shared_ptr, ... ecc

Aggiornamento

bind, shared_ptr sono esempi che aiutano a chiarire la mia domanda. La mia intenzione era di capire le differenze generali tra questi tre spazi dei nomi. Esistono diverse librerie che esistono in tutti e tre i namespace e apparentemente bind è un esempio, nonché shared_ptr.

Con quale spazio dei nomi devo attenermi? Personalmente preferisco la libreria da std:: poiché sarà lo standard successivo di C++ (C++ 0x).

+4

cambia domanda - aggiungi "bind", la domanda suggerisce che vuoi la differenza tra le librerie in generale – peenut

+0

@peenut, lui * è * chiedendo chiaramente la differenza generale. –

+0

è necessario chiarire. Pensi davvero che esista un 'boost :: vector' o' boost :: cout'? Cosa vuoi * effettivamente * vuoi sapere? –

risposta

28

1 - std::bind è il nome standard per esso. Questo sarà il nome che usi per le librerie compatibili con C++ 11. Elenco di tutti libraries in standardized C++.

2 - std::tr1::bind è uno spazio dei nomi di C++ Technical Report 1. Tra C++ 03 e C++ 11 c'era lo C++ Technical Report 1, che proponeva librerie e miglioramenti aggiuntivi. La maggior parte di questi esisteva già in Boost al momento e alcune di queste modifiche di libreria sono state adottate nello standard C++ 11, come <regex> e <functional> (che contiene std::bind). Lo spazio dei nomi std::tr1 è stato utilizzato per differenziare le librerie nello stato di work in progress, al contrario di tutto ciò che è standardizzato nello spazio dei nomi std.

3 - è per bind nello spazio dei nomi boost, se si utilizza la libreria Boost. Boost comprende molto più di ciò che è in TR1 e ciò che io nella libreria std di C++ 11. Elenco di tutti libraries in Boost as of 1.52.0

La maggior parte di quello che era in TR1 è stato standardizzato ed è nello spazio dei nomi C++ 11 std, e C++ 11 contiene più librerie di quelli riportati in TR1, che sono stati adattati da costrutti Boost, come il supporto threading definito in <thread>.

Parte di ciò che definisce cosa è possibile utilizzare e quale spazio dei nomi è possibile utilizzare ora dipende dal compilatore. Non ricordo, ma penso che le più recenti implementazioni di GCC-g ++ abbiano iniziato ad usare gli spazi dei nomi std per le nuove librerie C++ 11, ma potrebbe essere necessario un diverso flag del compilatore per attivarlo. Continueranno comunque a supportare lo spazio dei nomi std::tr1. Visual C++ 2010 ha spostato ciò che era in precedenza nello spazio dei nomi nello spazio dei nomi std, ma Visual C++ 2008 è ancora utilizzato std::tr1.

+1

@VJo, sì, ma non fingiamo che non sarà C++ 1x: p – birryree

+4

sarà C++ 0C – ybungalobill

+1

@ybungalobill +1 per farmi ridere. :) – birryree

2

Non dovrebbe fare una grande differenza dal momento che ampie parti del successivo standard C++ sono state effettivamente ereditate da Boost. Quindi se hai std::bind e non devi essere compatibile con altri compilatori, basta usarlo.boost::bind è buono se si desidera essere indipendenti dal compilatore. Penso che std::tr1::bind non abbia vantaggi rispetto agli altri due se sono disponibili: non è standard rispetto a C++ 03 e C++ 0x.

+1

Le definizioni sono state ereditate da boost ma l'implementazione del codice non lo è e ho trovato bug orribili in tr1 :: bind nel 2009, dove non ti ha nemmeno permesso di passare ref() correttamente. La mia sensazione è che non possono semplicemente copiare il codice boost nelle implementazioni STL e che è probabilmente inferiore perché il codice di boost è stato sottoposto a peer-review e testato per un lungo periodo, e quindi personalmente, a mia discrezione, avrei continuato ad aumentare. – CashCow

+0

@CashCow: grazie per il vostro consiglio. Ma che dire delle librerie std :: da VC++? Sono peggio delle librerie di boost? Ad esempio boost :: regex vs std :: regex? – Chan

9

Se si desidera utilizzare bind (o di qualsiasi altro per la materia), una caratteristica piacevole è namespace ridenominazione, ecco un esempio:

namespace MyNamespace = boost; 

void DoSomething(void) 
{ 
    MyNamespace::bind(...); 
} 

Ora, se si cambia MyNamespace essere:

namespace MyNamespace = std::tr1; 

I seguenti usi std::tr1::bind.

namespace MyNamespace = std::tr1; 

void DoSomething(void) 
{ 
    MyNamespace::bind(...); 
} 

Si dovrebbe, ovviamente, utilizzare MyNamespace per gli elementi che si desidera modificare con facilità è namespace in futuro, se si sa che si desidera std :: tr1 si dovrebbe usare direttamente e mai un alias.

+0

grazie per un trucco davvero fantastico! – Chan

5

Hai praticamente preso la tua domanda lì. Potrei semplicemente copiare/incollare il tuo esempio e rispondere correttamente alla tua domanda. Solo due cose si distinguono per l'espansione:

1) Esattamente COME e perché std :: viene espanso da tr1. TR1 è "Rapporto tecnico 1" ed è la prima serie ufficiale di espansioni di librerie proposte al comitato degli standard da uno dei suoi sottogruppi. Quindi è poco più che un'estensione dello standard.

2) boost :: bind in realtà si comporta diversamente da std :: bind, almeno su alcuni sistemi. Non so se è su standard non in ma nelle espressioni lambda di MSVC e std :: bind si comportano molto male l'uno con l'altro. Forse anche in altri modi, non ricordo poiché ho deciso di usare boost :: bind piuttosto che std :: bind. Il parametro template del valore di ritorno sembra essere spesso ignorato con std :: bind su msvc in modo da ottenere errori sul fatto che non ci sia return_value<f>::type (o altro) quando lo hai specificato con std::bind<type>(...). Non ci siamo mai presi la briga di capire l'esatta differenza di comportamento dal momento che boost :: bind era già entrato nel nostro vocabolario regolare e sapevamo come usarlo.