Quali funzionalità Boost si sovrappongono a C ++ 11?


192

Ho messo le mie abilità in C ++ sullo scaffale diversi anni fa e sembra che ora, quando ne ho ancora bisogno, il panorama sia cambiato.

Ora abbiamo C ++ 11 e la mia comprensione è che si sovrappone a molte funzionalità Boost.

Esiste un riassunto in cui si trovano quelle sovrapposizioni, che le librerie Boost stanno per diventare legacy, la raccomandazione di quali funzionalità di C ++ 11 utilizzare invece di quelle di boost e quali meglio no?


4
Boost è stato uno dei primi a implementare la libreria TR1. Dal momento che è ora nello standard, dovresti preferire la versione standard. Boost.Lambda ora è anche sostituito da lambda reali.
Kerrek SB,

6
L' articolo di Wikipedia su C ++ 11 ha un buon riassunto della maggior parte delle modifiche.
Qualche programmatore amico

Risposte:


286

Sostituibile con funzionalità o librerie del linguaggio C ++ 11

TR1 (sono contrassegnati nella documentazione se si tratta di librerie TR1)

Funzionalità di back-port da C ++ 11:

Sostituibile con le funzionalità del linguaggio C ++ 17:

  • String_ref → std :: string_view
  • Filesystem<filesystem> (Filesystem TS)
  • Opzionale → std :: opzionale ( Library Fundamentals TS v1 )
  • Any → std :: any (Library Fundamentals TS v1)
  • Matematica / Funzioni speciali<cmath>( Matematica speciale IS ), vedere l'elenco seguente
    • funzione beta
    • Polinomi di Legendre (normali / associati / sferici)
    • (normale / associato) polinomi di Legendre
    • Polinomi di Hermite
    • Funzioni di Bessel (J / Y / I / K) (Y è chiamata funzione Neumann in C ++)
    • funzioni sferiche di Bessel (j / y)
    • Integrali ellittici (incompleti / completi) di (primo / secondo / terzo tipo)
    • Funzione zeta di Riemann
    • integrale esponenziale Ei
  • Variante → std :: variant ( P0088R2 )

Il team standard ci sta ancora lavorando:

Una gran parte di MPL può essere ridotta o rimossa usando modelli variadici. Alcuni casi di utilizzo comune di fusione lessicale possono essere sostituiti da std :: to_string e std :: sto X .

Alcune librerie Boost sono correlate a C ++ 11 ma hanno anche alcune estensioni, ad esempio Boost.Functional / Hash contiene hash_combine e funzioni correlate non presenti in C ++ 11, Boost.Chrono ha I / O e arrotondamenti e molti altri orologi, ecc. quindi potresti voler dare un'occhiata a quelli boost prima di scartarli davvero.


1
Aggiungi all'elenco Boost.Chrono , Boost.Exception e Boost.Swap .
ildjarn,

9
Si noti che Boost.Lambda (o meglio, lambda Boost.Phoenix), sono ancora utili per lambda polimorfici.
Xeo,

2
Bella lista, anche se non credo che faccia std::unique_ptrparte di TR1 (dal momento che richiede una semantica di spostamento)
Nemo

1
@ildjarn: Boost.Chrono offre molte più funzioni rispetto a <chrono>. Boost.Exception - solo N2179 è rilevante.
kennytm,

2
@Nemo: Sì. Solo std :: tr1 :: shared_ptr fa parte di TR1 e const std :: unique_ptr sostituisce i casi d'uso di boost :: scoped_ptr e boost :: scoped_array
kennytm

56

In realtà, non credo che le librerie boost diventeranno legacy.

Sì, si dovrebbe essere in grado di utilizzare std::type_traits, regex, shared_ptr, unique_ptr, tuple<>, std::tie, std::begininvece di Typetraits Boost / Utility, Boost smart pointer, Boost Tuple, Boost librerie Gamma, ma ci deve essere in realtà alcuna reale necessità di 'passare' a meno che non ci si sposta più di il tuo codice in c ++ 11.

Inoltre, nella mia esperienza, le stdversioni della maggior parte di questi sono in qualche modo meno caratterizzate. Ad esempio AFAICT lo standard non ha

  • Perl5 espressioni regolari
  • call_traits
  • Alcuni membri dell'interfaccia regex (come bool boost::basic_regex<>::empty()) e altre differenze di interfaccia
    • questo morde di più poiché l'interfaccia Boost è esattamente abbinata a Boost Xpressive
    • e gioca molto più bene con Boost String Algorithms Ovviamente, questi ultimi non hanno controparti standard (ancora?)
  • Molte cose relative a TMP (Boost Fusion)
  • Lambdas pigri, basati su modelli di espressione; hanno inevitabili benefici in quanto possono essere polimorfici oggi , al contrario di C ++ 11. Pertanto possono spesso essere più concisi:

     std::vector<int> v = {1,2,-9,3};
    
     for (auto i : v | filtered(_arg1 >=0))
         std::cout << i << "\n";
    
     // or:
     boost::for_each(v, std::cout << _arg1);

    Sicuramente, questo ha ancora un certo fascino su C ++ 11 lambdas (con tipi di ritorno finali, acquisizione esplicita e parametri dichiarati).

Inoltre, c'è un ruolo GRANDE per Boost, proprio nel facilitare la migrazione di percorsi da C ++ 03 a C ++ 11 e nell'integrazione di codebase C ++ 11 e C ++ 03. Sto pensando in particolare

  • Boost Auto (BOOST_AUTO)
  • Boost Utility ( boost::result_of<>e relative)
  • Boost Foreach (BOOST_FOREACH)
  • Non dimenticare: Boost Move - che consente di scrivere classi con semantica di movimento con una sintassi che si compila ugualmente bene sui compilatori C ++ 03 con i compilatori Boost 1_48 + e C ++ 11.

Solo i miei $ 0,02

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.