Parti più utilizzate di Boost [chiuso]


115

Quando ho scoperto boost::lexical_castho pensato a me stesso "perché non lo sapevo prima!" - Odiavo dover scrivere codice come

stringstream ss;
ss << anIntVal;
mystring = ss.str();

Adesso scrivo

mystring = boost::lexical_cast<string>(anIntVal);

Ieri, su stackoverflow, mi sono imbattuto in boost split (un'altra gemma che mi farà risparmiare la scrittura di codice).

string stringtobesplit = "AA/BB-CC")
vector<string> tokens;

boost::split(tokens, stringtobesplit, boost::is_any_of("/-")); 
// tokens now holds 3 items: AA BB CC

Inizierò a esaminare la documentazione di boost alla ricerca di altre funzioni che sarò in grado di utilizzare regolarmente, ma sento che sarà molto facile perdere le cose.

Quali funzioni di potenziamento usi di più / non ti piacerebbe avere?


1
Per interesse, cosa ti ha impedito di scrivere la tua funzione "converti numero in stringa" prima di utilizzare Boost? Avrei visto la duplicazione e scritto un semplice modello e l'ho usato e poi, forse, sono passato alla versione boost quando l'ho trovata ...
Len Holgate

4
Ciao Len, In momenti diversi su progetti diversi ho scritto una funzione "ToStr" basata su modelli, ma poi passavo a qualche altro progetto, poi finivo per scrivere il 3-liner perché volevo solo fare la cosa maledetta: - ) in contrapposizione al sovraccarico di creare un file "misc_funcs"
hamishmcn

Risposte:


62

Probabilmente la parte più utilizzata di boost per me è boost :: shared_ptr .


13
Probabilmente anche il più usato. Io stesso ho imparato la lezione nel modo più duro dovendo eseguire il refactoring della maggior parte degli usi di shared_ptr tramite riferimenti, contenitori di puntatori e auto_ptr. Io ora sono d'accordo soprattutto per questo: bureau14.fr/blogea/index.php/2009/08/...
Amit

1
@phaedrus: Aggiornato link: blogea.bureau14.fr/index.php/2009/08/...
MatthewD

4
Non è più rilevante in C ++ 11 che ha std::shared_ptre std::unique_ptr.
einpoklum


34

I miei preferiti sono, in nessun ordine particolare:

  • regex
  • filesystem
  • filo
  • lexical_cast
  • program_options (semplicemente geniale!)
  • test (per tutte le mie esigenze di unit test).
  • Algoritmi di stringa
  • Tokenizzatore di stringhe
  • format (formattazione della stringa in stile printf indipendente dai tipi)
  • smart ptrs

Boost è stato di grande aiuto quando ho scritto la mia prima app multipiattaforma - senza di essa avrei davvero faticato.


4
Si prega di aggiornare per C ++ 11 / C ++ 14 ...
einpoklum

28

Mi piace come puoi fornire il tuo distruttore per shared_ptr.
Ciò significa, ad esempio, che puoi usarlo con FILE*e farlo chiudere il file per te.
per esempio

void safeclose(FILE*fp) {
    if(fp) {
        fclose(fp);
    }
}
void some_fn() {
    boost::shared_ptr<FILE> fp( fopen(myfilename, "a+t"), safeclose );
    //body of the function, and when ever it exits the file gets closed
    fprintf( fp.get(), "a message\n" );
}

1
So che sono passati quasi due anni, ma ... quell'assegnazione a NULLè inutile, poiché assegna il parametro della funzione locale. :)
Xeo

1
Grazie @Xeo, l'ho rimosso
hamishmcn

22

Nessuno ha menzionato i contenitori multi-indice, quindi suonerò in ritardo. Non è così spesso che ne hai bisogno, ma senza boost è un vero problema creare una struttura dati equivalente, oltre ad essere meno efficiente. Li ho usati molto di recente per creare contenitori che hanno la ricerca su 2 chiavi.


20

Sono sorpreso che nessuno l'abbia menzionato boost::optional. Mi ritrovo a usarlo più spesso di qualsiasi parte di Boost tranne shared_ptre scoped_ptr.


1
Ora disponibile come std::experimental::optionale presto (C ++ 17?) Come std::optional.
einpoklum

1
Sì, e ne sono molto felice. :-) Anche se considerando il ritardo tra gli standard e la loro piena implementazione in tutti i compilatori che uso, ci vorrà ancora un po 'prima che possa dipendere da esso ... Sono stato in grado di iniziare a usare C ++ 11 su un progetto l'anno scorso. :-(
Head Geek

In realtà penso che la maggior parte dei compilatori stia bene rispetto agli standard negli ultimi anni - GCC e clang hanno supportato C ++ 14 quando è stato rilasciato, no? Ad ogni modo, considera di integrare il tuo commento nella tua risposta.
einpoklum

@HeadGeek È interessante vedere un nuovo commento aggiunto alla tua risposta dopo 8 anni e hai risposto!
Deqing

Wow ... Credo che è stato otto anni. Come dice Kermit the Frog, il tempo è divertente quando hai le mosche. ;-)
Head Geek

19

Nessuno menziona boost :: tuple? Per vergogna!


2
Ora disponibile come std::tuple.
Dmitri Nesteruk

11

BOOST_STATIC_ASSERT

Aggiornamento (ottobre 2011): C ++ 11 (C ++ 0x) ha static_assert http://www2.research.att.com/~bs/C++0xFAQ.html#static_assert


5
BOOST_MPL_ASSERT_MSG consente di leggere / individuare errori molto facilmente che sono molto più informativi della dimensione del messaggio di tipo incompleto fornito da BOOST_STATIC_ASSERT.
KitsuneYMG

qui qui! Ho appena trovato uno di questi errori di tipo incompleto all'interno della macro di test BOOST_CHECK_CLOSE - mi ci è voluta mezza giornata per capire cosa stava succedendo prima di capire che lo avevo chiamato con (int, int, float); una volta che ho lanciato gli interi in virgola mobile, l'errore è andato via. Ma cosa ha a che fare con un tipo incompleto non lo so davvero :)
Jamie Cook

9

Uno dei miei più utilizzati non è in Boost vero e proprio, ma le Adobe Source Libraries (ASL) costruite sopra Boost, in particolare, le estensioni degli algoritmi standard che accettano un boost :: range al posto di iteratori di inizio / fine separati. Allora invece di chiamare, dì

std::for_each(some_container.begin(), some_container.end(), do_something());

Posso semplicemente dire

adobe::for_each(some_container, do_something());

(Spero che queste parti dell'ASL migrino a Boost alla fine.)


Mi piace, controllerò l'ASL
hamishmcn

8

Uso molto:

  • boost :: segnali
  • boost :: shared_ptr
  • boost :: lexical_cast
  • boost :: bind
  • boost :: casuale
  • boost :: filo
  • boost :: noncopyable

Altri come Tuple, Static Assert e Integer sono molto utili se stai scrivendo una libreria che deve essere utilizzata su una varietà di piattaforme.

Cose come Grafici e Lambda sono più specifiche.


Si prega di aggiornare per questi giorni di C ++ 11/14 (o considerare di rimuovere la risposta).
einpoklum

8

boost::shared_ptrè un requisito per la moderna programmazione C ++ IMHO. Ecco perché lo hanno aggiunto allo standard con TR1. boost::program_options, boost::binde boost::signalsono davvero carini se sai a cosa servono e come usarli. Gli ultimi due però tendono a spaventare i nuovi arrivati.


7

Abbiamo trovato boost :: spirit piuttosto utile per una soluzione aziendale per analizzare ECMAScript. Complesso, ma molto carino!



7

Uso shared_ptr da anni ormai. È così utile, non c'è motivo per cui un progetto dovrebbe essere senza di esso.

Inoltre, utilizzo anche Bind / Function / Lambda per meccanismi di callback generici, particolarmente utili durante i test, nonché Format per la sostituzione sprintf generica.

Infine, è stato proprio l'altro giorno quando ho usato Variant con rabbia per risolvere un problema (un parser che poteva rispondere con un piccolo set fisso di tipi di token non correlati). La soluzione era molto elegante e ne sono molto soddisfatto.


Gli anni sono passati ei tempi sono cambiati, quindi è tempo di un aggiornamento. SharedPtr e Function fanno ora parte dello standard e Bind e Lambda sono obsoleti dalla funzionalità lambda effettiva a livello di lingua.

Uso ancora Variant (che è stato anche standardizzato, ma non ci sono ancora), Format è in gran parte sostituito da fmtlib (che è stato anche standardizzato).

La parte più importante di Boost che utilizzo è Boost.Asio. Che sta per essere standardizzato.


1
Sono d'accordo con tutto quanto sopra, tranne Lambda. L'ho usato per un po ', ma è così tortuoso che l'ho abbandonato a tutti tranne che alle espressioni più semplici. Attendo con impazienza C ++ 0x e la sua forma di espressioni lambda.
Head Geek

Sono d'accordo sul fatto che Boost.Lambda sia pieno di ogni sorta di insidie: non appena entro nei regni di Unlambda o Protect, mi arrendo e lo faccio alla vecchia maniera, ma sembra essenziale estendere i callback in modo semi-decente . Detto questo, anch'io attendo l'implementazione del C ++ 0x.
Kaz Dragon,

6

Usare le tuple per iterare una mappa, in questo modo:

string key, value;
BOOST_FOREACH(tie(key, value), my_map) { ... }

Usando boost assign, posso inizializzare una mappa come questa:

map<string, string> my_map = map_list_of("key1", "value1")("key2", "value2")("key3", "value3");

E utilizzando gli adattatori di intervallo e l'operatore pipe ("|") posso iterare all'indietro sui valori di una mappa (come esempio):

BOOST_FOREACH(string value, my_multimap.equal_range("X") | map_values | reversed) { ... }

1
È davvero fantastico. Mi ha fatto leggere la documentazione per l'assegnazione del boost: boost.org/doc/libs/1_49_0/libs/assign/doc/index.html
hamishmcn

5

Dovresti controllare boost :: program_options. Rende molto più semplice l'analisi della riga di comando.


5

Uso i contenitori Boost Pointer piuttosto che un contenitore STL di shared_ptrs.



3

Adoro boost :: random e boost :: asio e boost :: filesystem, tuttavia boost :: bind, boost :: circular_buffer e boost :: thread sono molto pratici, i puntatori intelligenti sono ok ma preferisco RAII invece come gestione della memoria


6
I puntatori intelligenti sono RAII.
Eclipse

4
più precisamente, i puntatori intelligenti ti danno RAII quando non c'è altra scelta che allocare la memoria in modo dinamico.
Branan

3

Ok, eccone uno nuovo che ho trovato:
invece di usare stricmp posso usare la funzione uguale di boost e passare il predicato is_iequal
ad esempio:
invece di

stricmp( "avalue", mystr.c_str() ) == 0

posso usare

equals( "avalue", mystr, is_iequal() ) 

dato:

#include <boost/algorithm/string.hpp>
using namespace boost::algorithm;

3

Ecco i miei due centesimi:

  • boost :: scope_exit - non è necessario definire la classe RAII solo per un uso
  • boost :: qualsiasi
  • boost :: variant
  • Boost Pointer Container Library (ptr_vector)
  • Potenzia la libreria della piscina
  • boost :: unordered_map / boost :: unordered_set

3

Uso boost::iclparecchio per la post-elaborazione del testo. Mi ha fatto risparmiare un bel po 'di tempo perché altrimenti avrei dovuto implementare la suddivisione del testo da solo ...

BOOST_FOREACH è ovunque nel mio codice :)

boost::functione boost::bindsono un must assoluto. Anche se ora lo sono std::functione std::bind. Questi aiutano davvero a ridurre la quantità di codice non necessario e sono generalmente buoni per i miei progetti (o le mie delusioni).

Ho iniziato a usare di recente boost::interprocess::message_queuee anche questo è un ottimo strumento.

Ne userei molto di più, ma Qt ha modi nativi di fare molte cose che Boost fa. Se mai dovessi programmare puro C ++, immagino che diventerei un boost::junkie:)


3

Quello che uso di più è ora disponibile nel TR1:

  • puntatori condivisi
  • classe di matrice

Ora uso anche classi pool e altre cose più specifiche.

Capisci ora che Boost è pensato per essere utile alla maggior parte dei programmatori, ecco perché è il banco di prova per la futura libreria standard.


1

Parlando di boost :: lexical_cast, perché qualcosa come "format" non è un membro statico nella libreria std :: string?
Quasi tutte le librerie gui hanno qualcosa come CString :: Format ("% i") o QString :: Number ("% i") che restituiscono una stringa inizializzata.


4
ad esempio: std::string = boost::format("Hello, %1% %2%") % "world" % "!!!").str();
Rob

Se si è disposti a rinunciare all'indipendenza dai tipi, è possibile eseguire il rollio della propria con vsnprintf (), i puntini di sospensione (...), va_list / stdarg.h e un buffer locale (basato sullo stack).
signor Ree,

2
std :: string ha già 71 funzioni di troppo (secondo il conteggio di Herb Sutter, non mio). Vedi gotw.ca/gotw/084.htm per i dettagli: Penso che abbia abbastanza informazioni per spiegare (a) perché il formato non deve essere in std :: string e (b) perché è meglio scrivere algoritmi generici rispetto ai membri della classe funziona comunque.
Steve Jessop,

4
O per dirla in un altro modo, "C ++ è come un paese straniero: lì fanno le cose in modo diverso" ;-)
Steve Jessop

1
Il formato non fa parte della libreria perché una delle sfide poste da Stroustrup mentre progettava C ++ era la costruzione di una libreria I / O formattata indipendente dai tipi. Ovviamente, il risultato è stato quello che vedi con iostreams. A quanto pare, nessuno aveva pensato all'interpolazione in quel momento. Forse qualcuno vorrebbe scrivere un formatstream, per far sentire i tradizionalisti più a casa?
Phil Miller

1

Penso che la domanda dovrebbe essere ribaltata. Quale parte del tuo boost non vorresti usare?

Nella mia esperienza praticamente tutto è interessante e utile in ogni dominio problematico.

Dovresti dedicare del tempo a esaminare la documentazione del boost per trovare le aree che coprono i tuoi interessi.

Un'eccezione può essere boost::numeric::ublasche fa il suo lavoro, ma Eigen lo fa notevolmente meglio.


Dubito che la libreria octonion sia usata da molti.
Petter
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.