Partes más usadas de Boost [cerrado]

115

Cuando lo descubrí boost::lexical_cast, pensé para mis adentros "¿por qué no me enteré de esto antes?" - Odiaba tener que escribir código como

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

Ahora escribo

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

Ayer, en stackoverflow, me encontré con boost split (otra joya que me ahorrará escribir código).

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

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

Voy a comenzar a revisar la documentación de boost en busca de otras funciones que pueda usar regularmente, pero creo que será muy fácil pasar por alto cosas.

¿Qué funciones de refuerzo usa más / odiaría no tener?

hamishmcn
fuente
1
Por interés, ¿qué le impidió escribir su propia función "convertir número en cadena" antes de utilizar Boost? Habría visto la duplicación y escrito una plantilla simple y la usé y luego, tal vez, cambié a la versión boost cuando la encontré ...
Len Holgate
4
Hola Len, En diferentes momentos en diferentes proyectos, escribí una función "ToStr" con plantilla, pero luego pasaría a otro proyecto, luego terminaría escribiendo el 3-liner porque solo quería hacer la maldita cosa: - ) en lugar de la sobrecarga de crear un archivo "misc_funcs"
hamishmcn

Respuestas:

62

Probablemente la parte más utilizada de boost para mí es boost :: shared_ptr .

el
fuente
13
También probablemente el más usado. Yo mismo aprendí la lección de la manera más difícil al tener que refactorizar la mayoría de los usos de shared_ptr por referencias, contenedores de punteros y auto_ptr. Ahora estoy mayormente de acuerdo con esto: bureau14.fr/blogea/index.php/2009/08/…
amit
1
@phaedrus: Enlace actualizado: blogea.bureau14.fr/index.php/2009/08/…
MatthewD
4
Ya no es relevante en C ++ 11 que tiene std::shared_ptry std::unique_ptr.
einpoklum
49

BOOST_FOREACH vuelve a hacer que la vida valga la pena.

(¿Por qué nadie ha mencionado esto? ¡La pregunta se hizo hace 8 meses!)

Paul Biggar
fuente
15
El artículo de Eric Niebler sobre "Amor condicional" ( artima.com/cppsource/foreach.html ) describe cómo funciona BOOST_FOREACH. Es una locura.
Jeff Hardy
2
Ya no es tan popular con C ++ 11 y lambdas ...
einpoklum
34

Mis favoritos son, sin ningún orden en particular:

  • regex
  • sistema de archivos
  • hilo
  • lexical_cast
  • program_options (¡simplemente genial!)
  • test (para todas mis necesidades de pruebas unitarias).
  • Algoritmos de cadenas
  • Tokenizador de cadenas
  • formato (formato de cadena de estilo printf con seguridad de tipo)
  • ptrs inteligentes

Boost fue una gran ayuda cuando escribí mi primera aplicación multiplataforma; sin ella, realmente habría tenido problemas.

Robar
fuente
4
Actualice
28

Me gusta cómo puede proporcionar su propio destructor shared_ptr.
Esto significa, por ejemplo, que puede usarlo con FILE*y hacer que cierre el archivo por usted.
p.ej

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" );
}
hamishmcn
fuente
1
Sé que han pasado casi dos años, pero ... esa asignación NULLes inútil, ya que asigna el parámetro de función local. :)
Xeo
1
Gracias @Xeo, lo he eliminado
hamishmcn
22

Nadie ha mencionado los contenedores de índices múltiples, así que intervendré más tarde. No es tan frecuente que los necesite, pero sin un impulso es un verdadero dolor crear una estructura de datos equivalente, además de ser menos eficiente. Los he estado usando mucho recientemente para crear contenedores que buscan 2 claves.

Greg Rogers
fuente
20

Me sorprende que nadie lo haya mencionado boost::optional. Me encuentro usándolo con más frecuencia que cualquier parte de Boost excepto shared_ptry scoped_ptr.

Jefe Geek
fuente
1
Ahora disponible como std::experimental::optionaly pronto (¿C ++ 17?) Como std::optional.
einpoklum
1
Sí, y estoy muy feliz por eso. :-) Aunque teniendo en cuenta el retraso entre los estándares y la implementación completa de ellos en todos los compiladores que uso, todavía pasará un tiempo antes de que pueda depender de ello ... Pude comenzar a usar C ++ 11 en un proyecto el año pasado. :-(
Head Geek
En realidad, creo que la mayoría de los compiladores están bien para cumplir con los estándares en los últimos años: GCC y clang admitían C ++ 14 cuando se lanzó, ¿no? De todos modos, considere integrar su comentario en su respuesta.
einpoklum
@HeadGeek Es interesante ver un nuevo comentario agregado a su respuesta después de 8 años, ¡y respondió!
Deqing
Vaya ... supongo que han pasado ocho años. Como dice Kermit the Frog, el tiempo es divertido cuando tienes moscas. ;-)
Head Geek
19

Nadie menciona boost :: tuple? ¡Para vergüenza!


fuente
2
Ahora disponible como std::tuple.
Dmitri Nesteruk
11

BOOST_STATIC_ASSERT

Actualización (octubre de 2011): C ++ 11 (C ++ 0x) tiene static_assert http://www2.research.att.com/~bs/C++0xFAQ.html#static_assert

Alessandro Jacopson
fuente
5
BOOST_MPL_ASSERT_MSG permite muy fácil de leer / detectar errores que son mucho más informativos que el tamaño del mensaje de tipo incompleto que proporciona BOOST_STATIC_ASSERT.
KitsuneYMG
¡aquí Aquí! Acabo de encontrar uno de estos errores de tipo incompletos dentro de la macro de prueba BOOST_CHECK_CLOSE. Me tomó medio día averiguar qué estaba pasando antes de que dijera que lo había llamado con (int, int, float); una vez que lancé los enteros al punto flotante, el error desapareció. Pero qué tiene que ver eso con un tipo incompleto, realmente no lo sé :)
Jamie Cook
9

Uno de mis más utilizados no es en Boost propiamente dicho, sino en las bibliotecas de origen de Adobe (ASL) creadas sobre Boost, específicamente, las extensiones de los algoritmos estándar que aceptan un boost :: rango en lugar de iteradores de inicio / fin separados. Entonces, en lugar de llamar, di:

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

Simplemente puedo decir

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

(Espero que estas partes de ASL migren eventualmente a Boost).

Jon Reid
fuente
Me gusta,
revisaré
8

Yo uso mucho:

  • boost :: señales
  • boost :: shared_ptr
  • boost :: lexical_cast
  • boost :: enlazar
  • boost :: aleatorio
  • boost :: hilo
  • impulso :: no copiable

Otros como Tuple, Static Assert y Integer son muy útiles si está escribiendo una biblioteca que se utilizará en una variedad de plataformas.

Cosas como Graphs y Lambda son más específicas.

Cyrille Ka
fuente
Actualice para estos días de C ++ 11/14 (o considere eliminar la respuesta).
einpoklum
8

boost::shared_ptres un requisito para la programación moderna de C ++ en mi humilde opinión. Por eso lo agregaron al estándar con TR1. boost::program_options, boost::bindy boost::signalson realmente agradables si sabes para qué sirven y cómo usarlos. Sin embargo, los dos últimos tienden a asustar a los recién llegados.

D.Shawley
fuente
7

Hemos encontrado que boost :: spirit es bastante útil para una solución empresarial para analizar ECMAScript. Complejo, pero muy bonito.

Kit10
fuente
7

Me sorprende no ver todavía entre las respuestas Boost.Thread .

Vicente Botet Escriba
fuente
3
Ahora hay std::thread.
einpoklum
7

He estado usando shared_ptr durante años. Es tan útil que no hay razón por la que un proyecto deba estar sin él.

Además de eso, también uso Bind / Function / Lambda para mecanismos de devolución de llamada genéricos, especialmente útiles cuando se realizan pruebas, así como Format para mi reemplazo de sprintf de propósito general.

Finalmente, fue solo el otro día cuando usé Variant con ira para resolver un problema (un analizador que podía responder con un conjunto pequeño y fijo de tipos de tokens no relacionados). La solución fue muy elegante y estoy muy contento con ella.


Han pasado los años y los tiempos han cambiado, así que es hora de actualizar. SharedPtr y Function ahora forman parte del estándar, y Bind y Lambda están obsoletos debido a la funcionalidad lambda real a nivel de lenguaje.

Todavía uso Variant (que también se ha estandarizado, pero aún no he llegado allí), Format se reemplaza en gran medida por fmtlib (que también se ha estandarizado).

La gran parte de Boost que uso es Boost.Asio. Que está en proceso de estandarización.

Dragón Kaz
fuente
1
Estoy de acuerdo con todo lo anterior, excepto Lambda. Lo usé por un tiempo, pero es tan tortuoso que lo abandoné por todas las expresiones menos las más simples. Esperando ansiosamente C ++ 0x y su forma de expresiones lambda.
Head Geek
Estoy de acuerdo en que Boost.Lambda está lleno de todo tipo de trampas: tan pronto como entro en los reinos de Unlambda o Protect, me rindo y lo hago a la antigua, pero parece esencial para extender las devoluciones de llamada de una manera medio decente. . Dicho esto, yo también espero la implementación de C ++ 0x.
Kaz Dragon
6

Usando tuplas para iterar un mapa, como este:

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

Usando boost asignar, puedo inicializar un mapa como este:

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

Y usando adaptadores de rango y el operador de tubería ("|") puedo iterar hacia atrás sobre los valores de un mapa (como ejemplo):

BOOST_FOREACH(string value, my_multimap.equal_range("X") | map_values | reversed) { ... }
Paul Fultz II
fuente
1
Eso es realmente genial. Me hizo leer la documentación para la asignación de impulso: boost.org/doc/libs/1_49_0/libs/assign/doc/index.html
hamishmcn
5

Debería comprobar boost :: program_options. Hace que el análisis de la línea de comandos sea mucho más fácil.

Desarrollador triste
fuente
5

Yo uso Boost Pointer Containers en lugar de un contenedor STL de shared_ptrs.

amit
fuente
3

Me encanta boost :: random y boost :: asio y boost :: filesystem, sin embargo boost :: bind, boost :: circular_buffer y boost :: thread son muy prácticos, los punteros inteligentes están bien, pero prefiero RAII como administración de memoria

Robert Gould
fuente
6
Los punteros inteligentes son RAII.
Eclipse
4
Más precisamente, los punteros inteligentes le brindan RAII cuando no hay más remedio que asignar memoria de forma dinámica.
Branan
3

De acuerdo, aquí hay uno nuevo que encontré: en
lugar de usar stricmp , puedo usar la función igual de boost y pasar el predicado is_iequal,
por ejemplo: en
lugar de

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

Puedo usar

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

dado:

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

Aquí están mis dos centavos:

  • boost :: scope_exit - no es necesario definir la clase RAII solo para un uso
  • boost :: cualquiera
  • impulso :: variante
  • Boost Pointer Container Library (ptr_vector)
  • Boost Pool Library
  • boost :: unordered_map / boost :: unordered_set
anatoly
fuente
3

Utilizo boost::iclbastante para el posprocesamiento de texto. Me ahorré bastante tiempo porque de lo contrario tendría que implementar la división de texto yo mismo ...

BOOST_FOREACH está en todas partes en mi código :)

boost::functiony boost::bindson una necesidad absoluta. Aunque ahora son std::functiony std::bind. Estos realmente ayudan a reducir la cantidad de código innecesario y generalmente son buenos para mis diseños (o mis delirios).

Recientemente comencé a usar boost::interprocess::message_queuey esta también es una gran herramienta.

Usaría mucho más, pero Qt tiene formas nativas de hacer muchas cosas que hace Boost. Si alguna vez tuviera que programar en C ++ puro, supongo que me convertiría en boost::junkie:)

Zeks
fuente
3

Lo que más uso ahora está disponible en el TR1:

  • punteros compartidos
  • clase de matriz

Ahora también uso clases de pool y algunas otras cosas más específicas.

Ahora comprende que Boost está destinado a ser útil para la mayoría de los programadores, por eso es el banco de pruebas para la futura biblioteca estándar.

Klaim
fuente
1

Hablando de boost :: lexical_cast, ¿por qué algo como 'formato' no es un miembro estático en la biblioteca std :: string?
Casi todas las gui libs tienen algo como CString :: Format ("% i") o QString :: Number ("% i") que devuelven una cadena inicializada.

Martin Beckett
fuente
4
Por ejemplo: std::string = boost::format("Hello, %1% %2%") % "world" % "!!!").str();
Rob
Si está dispuesto a renunciar a la seguridad de tipos, puede lanzar la suya propia con vsnprintf (), puntos suspensivos (...), va_list / stdarg.h y un búfer local (basado en pila).
Mr.Ree
2
std :: string ya tiene 71 funciones de más (según la cuenta de Herb Sutter, no la mía). Consulte gotw.ca/gotw/084.htm para obtener más detalles: creo que tiene suficiente información para explicar (a) por qué el formato no necesita estar en std :: string, y (b) por qué es mejor escribir algoritmos genéricos que miembros de clase funciona de todos modos.
Steve Jessop
4
O para decirlo de otra manera, "C ++ es como un país extranjero: allí hacen las cosas de manera diferente" ;-)
Steve Jessop
1
El formato no es parte de la biblioteca porque uno de los desafíos que se le planteó a Stroustrup mientras diseñaba C ++ era la construcción de una biblioteca de E / S formateada con seguridad de tipos. Obviamente, el resultado fue lo que ves con iostreams. Al parecer, nadie había pensado en la interpolación en ese momento. ¿Quizás a alguien le gustaría escribir un formato para hacer que los tradicionalistas se sientan más como en casa?
Phil Miller
1

Creo que la pregunta debería invertirse. ¿Qué parte de ti impulso no querrías? usar?

En mi experiencia, casi todo es interesante y útil en cada dominio del problema.

Debería dedicar tiempo a buscar en toda la documentación de impulso para encontrar las áreas que cubren sus intereses.

Una excepción puede ser boost::numeric::ublascuál hace su trabajo, pero Eigen lo hace notablemente mejor.

Rodrigob
fuente
Dudo que muchos utilicen la biblioteca octonion.
Petter