2009-02-23 17 views
26

Ho cercato la revisione 1.38.0 delle librerie Boost, nel tentativo di decidere se ci sono abbastanza gioielli lì per giustificare la negoziazione del processo di approvazione del software esterno della mia azienda. Nel corso di scrittura di programmi di test e la lettura dei documenti, ho raggiunto un paio di conclusioniQuali sono i migliori componenti di Boost?

  • ovviamente, non tutto in Boost potrà mai essere utili nel mio gruppo di ingegneria più
  • importante, alcuni di questi le biblioteche sembrano più raffinate di altre

In effetti, alcune librerie mi sembrano un po 'giocattolo.

ci sono un certo numero di librerie abbastanza accessibili che posso vedere mettendo a frutto dopo solo un breve periodo di indagine, come boost :: variante (Mi piace molto il visitatore componente e il fatto che il compilatore barfs se un visitatore manca di un operatore per uno dei tipi di variante). Vorrei usare boost :: shared_ptr eccetto per il fatto che il nostro gruppo ha già una serie di tipi di puntatori intelligenti.

Quindi, sulla base della vasta esperienza degli utenti di overflow dello stack, che Boost librerie

  • hanno alta qualità?
  • sono più che giocattoli?
  • ci sono quelli che hanno un'alta barriera d'ingresso ma che vale la pena imparare?

Si noti che questa è una domanda un po 'diverso da quello rappresentato nel Boost considered harmful?

P.S. - È stata cancellata una delle risposte (da litb)? Non riesco a vederlo qui e solo un estratto sulla mia pagina utente ...

risposta

19

io uso abbastanza frequentemente (e rende la mia vita più semplice): puntatori

  • intelligenti (shared_ptr, scoped_ptr, weak_ptr, interprocess unique_ptr):

    • scoped_ptr per Raii di base (senza condivisa proprietà e trasferimento di proprietà), senza alcun costo.
    • shared_ptr per operazioni più complesse - quando è necessaria la proprietà condivisa. Tuttavia c'è qualche costo.
    • unique_ptr - c'è un lavoro attivo per potenziare l'unificazione di vari approcci (presenti a Boost) a unique_ptr con l'emulazione di spostamento.
    • Sono veramente semplice da usare (solo intestazione), facile da imparare e molto ben collaudato (beh, tranne forse il unique_ptr)
  • Boost Discussione - attivamente sviluppato (le discussioni sono ora mobile) libreria per lavorare con fili. Nasconde la complessità dell'implementazione del thread su una determinata piattaforma.

  • Amplificate MPL e Fusion: sono più difficili da spiegare. Per molto tempo non ho usato il potere del tempo di compilazione, ma dopo alcune letture e apprendimenti è emerso che parte del mio codice può essere ben semplificata. Ancora, attenti al tempo di compilazione ...

  • Boost Asio

    • Contrariamente alla prima impressione (almeno un po 'di tempo fa) non è solo la libreria di rete. Fornisce un modello I/O asincrono che può essere utilizzato praticamente per qualsiasi cosa.
  • Boost Format (formattazione dell'output potente, ma molto pesante)

  • Boost Spirit2x (Karma e Qi utilizzati sia per l'analisi e la generazione di uscita sulla base di un dato di grammatica). Davvero potente, può creare un parser senza ricorrere a strumenti esterni. Eppure il tempo di compilazione potrebbe essere un problema.Anche la versione 2x è attivamente sviluppato e la documentazione è piuttosto scarsa (mailing list spirito-devel è molto utile però)

  • Boost Bind, Funzione e Lambda per rendere la vita più facile e Boost Phoenix - solo per sperimentare

  • lexical_cast (qualcosa di simile potrebbe nascere presto boost :: string)

  • Regex/Xpressive - espressioni regolari

  • Tipo tratti e controlli concetto - ancora una volta, per rendere la vita più facile

  • Math:

    • vari generatori di numeri casuali
    • diverse distribuzioni statistiche
    • uBLAS - per utilizzando le associazioni LAPACK/BLAS in C++ modo come
    • alcune funzioni matematiche, normalmente disponibile in C++
    • alcuni strumenti per il controllo delle conversioni tra tipi numerici
    • intervallo aritmetica
  • Boost Iterator (adattatori specializzati per iteratori e la facciata per creare il proprio)

  • Boost Unit Testing quadro

E ancora ci sono alcune parti che avevo appena toccato in Incremento. Probabilmente ho anche dimenticato di menzionarne solo alcuni ovvi.

Ricordarsi di utilizzare gli strumenti giusti (martelli) per i giusti problemi (chiodi). Ricorda di mantenere le soluzioni semplici. Ricordare il costo delle funzionalità ricevute (ad esempio shared_ptr o boost::format sovraccarico di runtime o costi di compilazione MPL/Fusion/Spirit/Phoenix e dimensioni dell'eseguibile). Ma sperimenta e impara - è dove si trova il divertimento.

E quando si tratta di convincere la gestione a utilizzare le nuove librerie, non è necessario iniziare con tutte le librerie. Inizia con le cose semplici (probabilmente quelle che hanno una storia Boost lunga e stabile, un ampio supporto per il compilatore, sono previste per l'inclusione in TR2/C++ 1x, ecc.) E semplici esempi che mostrano i vantaggi.

4

Boost :: lambda è utile se si utilizza STL. Esso consente di creare predicati a posto, come questo:

for_each(a.begin(), a.end(), std::cout << _1 << ' '); 

Questo codice restituisce tutti gli elementi da contenitore separati da spazi.

+0

piace questo? stai dicendo che l'inclusione di boost supporterebbe questo: for_each (a.begin(), a.end(), std :: cout << _1 << ''); ? –

+0

Booster lambda consente esattamente questo. – Richard

+0

Boost :: Lambda è troppo fastidioso da usare per qualcosa di molto più complicato di così, almeno per me. –

4

Molte delle aggiunte alla libreria standard C++ 0x sono state inizialmente create come parte delle librerie Boost.

Non sono perfetti (qualsiasi software), ma il processo di progettazione utilizzato è piuttosto robusto (molto più della maggior parte del software libero). Se hai bisogno di aiuto, troverai molto sulla mailing list.

8

Spesso uso boost :: filesystem. Fa tutto il necessario per la semplice gestione dei file

6

direi che le librerie sono preziosi:

  • Metaprogrammazione (MPL, enable_if, type/function_traits)
  • preprocessore - se ne avete bisogno, può tornare utile
  • variante, optional - come si già annotato
  • Matematica - quaternioni, funzioni matematiche aggiuntive (anche se potrebbero non essere utili a voi)
  • lambda: sebbene la sintassi sia pelosa, è piuttosto avvincente
  • operatori/iteratori: sono davvero a portata di mano quando si costruisce i propri tipi

Forse Python (mai provato, ma alcuni per esempio. programmi di KDE usano)

4

Personalmente ritengo si dovrebbe dare un'occhiata a librerie che nasconde cose specifiche piattaforma come threading, IPC, la memoria di file, file system, asincrono IO ecc

questi si può risparmiare un sacco di mappato tempo e difficoltà nei progetti multipiattaforma e tende a focalizzarsi sull'esposizione delle funzionalità piuttosto che sugli esercizi in fantasiose funzionalità del linguaggio C++.

+1

Come commento generale, penso che tu sia perfetto.Ma come puntatori intelligenti, il mio gruppo ha una struttura matura che include l'astrazione di hardware e filesystem, la portabilità dei dati cross-network, ecc. Da qui l'interesse per i concetti di livello superiore. –

13

ho trovato boost essere un incontrastato must-have durante la progettazione multi-piattaforma (ad esempio * nix e win32) le applicazioni multi-threaded (boost::thread, boost::interprocess.) Questo da solo è stato una giustificazione sufficiente in almeno un caso per adottando boost come parte dei progetti dei miei datori di lavoro.

Il resto (contenitori, programmazione generica e meta-programmazione, memoria) seguito come omaggi.

3

Se è necessario analizzare i file di testo che sono più complessi di quelle coppie chiave/valore, consiglio vivamente Boost::spirit. Ha una curva di apprendimento elevata, ma una volta capito, ti consente di incorporare facilmente grammatiche EBNF nel codice. È molto più robusto rispetto alla scrittura del parser. Mi trovo anche a creare formati di file che sono progettati più per la facilità dello scrittore del file rispetto allo scrittore del codice di analisi.

2

ho trovato boost.thread e boost.asio indispensabile per la scrittura di applicazioni client/server. La libreria puntatore intelligente semplifica la scrittura di codice che utilizza la gestione delle eccezioni senza perdite di memoria.

In una nota a margine, una serie di file PDF che documentano alcune delle librerie boost più comuni è stata rilasciata di recente. Puoi scaricarli dal SourceForge.

+0

L'ho scaricato e sfogliando alcune delle librerie per le quali ho già scritto programmi giocattolo, sembra che questi siano solo PDF della documentazione fornita con le librerie Boost? Non è così per alcuni di loro? –

+0

No, è tutto, per quanto ne so. –

2

Ho letto le altre risposte e ho necessario per aggiungere Boost.Graph (BGL) e il suo amico Boost.Property_map. Questi due hanno letteralmente cambiato il mio lavoro quotidiano.

È estremamente ben progettato, ma all'inizio la maggior parte delle persone viene scoraggiata perché c'è un prezzo piuttosto alto da pagare prima di capire effettivamente lo scopo di tutti i concetti. Ma una volta presa in mano questa libreria, diventa difficile farne a meno!

Problemi correlati