2009-02-23 19 views
26

He estado navegando por la revisión 1.38.0 de las bibliotecas de Boost, en un intento de decidir si hay suficientes joyas para justificar la negociación del proceso de aprobación de software externo de mi empresa. En el curso de la escritura de programas de prueba y la lectura de los documentos, que he llegado a un par de conclusiones¿Cuáles son los mejores componentes de Boost?

  • por supuesto, no todo en Boost siempre será de utilidad en mi grupo de ingeniería
  • más importante, algunos de estos las bibliotecas parecen más pulidas que otras

De hecho, algunas bibliotecas me parecen un poco juguetonas.

Hay una serie de bibliotecas bastante accesible que puedo ver poniendo a utilizar después de un corto período de investigación, tales como impulso :: variante (me gusta mucho el componentevisitante y el hecho de que el compilador barfs si un visitante no tiene un operador para uno de los tipos de variantes). Usaría boost :: shared_ptr, excepto por el hecho de que nuestro grupo ya tiene un conjunto de tipos de punteros inteligentes.

Así que basado en la amplia experiencia de los usuarios desbordamiento de pila, que Boost bibliotecas

  • tienen alta calidad?
  • son más que juguetes?
  • ¿Hay alguna que tenga una barrera de entrada alta pero que vale la pena aprender?

Tenga en cuenta que esta es una pregunta un tanto diferente a la planteada en Boost considered harmful?

P. S. - ¿Se ha eliminado una de las respuestas (de litb)? No puedo verlo aquí, y solo un extracto en mi página de usuario ...

Respuesta

19

que utilizan con bastante frecuencia (y me hace la vida más simple): punteros

  • inteligentes (shared_ptr, scoped_ptr, weak_ptr, entre procesos unique_ptr):

    • scoped_ptr para RAII básica (sin compartida transferencia de propiedad y propiedad), sin costo.
    • shared_ptr para operaciones más complejas: cuando se necesita propiedad compartida. Sin embargo, hay algún costo.
    • unique_ptr - hay un trabajo activo en impulsar unificar varios enfoques (presentes en Boost) a unique_ptr con la emulación de movimiento.
    • Ellos son realmente fáciles de usar (Sólo encabezado), fácil de aprender y muy bien probado (bueno, excepto quizás el unique_ptr)
  • Boost Tema - desarrollado activamente (roscas están ahora móvil) biblioteca para trabajar con hilos Oculta la complejidad de la implementación de subprocesos en una plataforma determinada.

  • Boost MPL y Fusion: son más difíciles de explicar. Durante mucho tiempo no utilicé el tiempo de compilación, pero después de leer y aprender resultó que parte de mi código se puede simplificar. Sin embargo, tenga cuidado con el tiempo de compilación ...

  • Boost Asio

    • Contrariamente a la primera impresión (por lo menos hace algún tiempo) no es sólo la biblioteca de red. Proporciona un modelo de E/S asíncronas que se puede usar para prácticamente cualquier cosa.
  • Formato Boost (formato de salida de gran alcance, pero muy pesada)

  • Boost Spirit2x (Karma y Qi utilizan tanto para el análisis y la salida de la generación de la base de una gramática dada). Realmente poderoso, puede crear un analizador sin recurrir a herramientas externas. Sin embargo, el tiempo de compilación podría ser un problema.También versión 2x ​​se está desarrollando de manera activa y la documentación es más bien escasa (la lista de correo espíritu-devel es muy útil sin embargo)

  • Boost Bind, función y Lambda para hacer su vida más fácil y Boost Phoenix - sólo para experimentar

  • lexical_cast (algo similar podría nacer pronto como impulso :: string)

  • expresión regular/Xpressive - expresiones regulares

  • características de tipo y cheques concepto - una vez más para hacer su vida más fácil

  • matemática:

    • varios generadores de números aleatorios
    • diferentes distribuciones estadísticas
    • ublas - para el uso de los enlaces de LAPACK/BLAS en C++ manera como
    • algunas funciones matemáticas, normalmente no disponibles en C++
    • algunas herramientas para controlar las conversiones entre los tipos numreric
    • aritmética de intervalo
  • Boost iterador (adaptadores especializados para iteradores y fachada para la creación de su propia)

  • Boost marco de pruebas unitarias

Y todavía hay algunas partes que apenas había tocado de Aumentar. Probablemente también olvidé mencionar algunos pocos obvios.

Recuerde utilizar las herramientas adecuadas (martillos) para los problemas correctos (las uñas). Recuerde mantener las soluciones simples. Recuerde el costo de la funcionalidad recibida (por ejemplo, shared_ptr o boost::format gastos generales de tiempo de ejecución o costos de compilación de MPL/Fusion/Spirit/Phoenix y tamaños de ejecutables). Pero experimenta y aprende, es donde está la diversión.

Y cuando se trata de convencer a la administración para usar las nuevas bibliotecas, no tiene que comenzar con todas las bibliotecas. Comience con las cosas simples (probablemente las que tienen un historial de Boost largo y estable, amplia compatibilidad con el compilador, están planificadas para su inclusión en TR2/C++ 1x, etc.) y ejemplos sencillos que muestran los beneficios.

4

Boost :: lambda es algo útil si usa STL. Se le permite crear predicados en su lugar, como este:

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

Este código da salida a todos los elementos de contenedores separados por espacios.

+0

como este? ¿Estás diciendo que la inclusión de boost apoyaría eso: for_each (a.begin(), a.end(), std :: cout << _1 << ''); ? –

+0

Boost lambda permite eso exactamente. – Richard

+0

Boost :: Lambda es demasiado molesto para usar para algo mucho más complicado que eso, al menos para mí. –

4

Muchas de las adiciones a la biblioteca estándar de C++ 0x se crearon primero como parte de las bibliotecas de Boost.

No son perfectos (es cualquier software) pero el proceso de ingeniería utilizado es bastante robusto (mucho más que la mayoría del software libre). Si necesita ayuda, encontrará muchos en la lista de correo.

8

A menudo uso boost :: filesystem. Hace todo lo necesario para la gestión de archivos simple

5

Boost interprocess es definitivamente vale la pena si estás haciendo cosas con memoria compartida & similares.

6

yo diría que las bibliotecas son valiosos:

  • Metaprogramación (MPL, enable_if, type/function_traits)
  • preprocesador - si lo necesita, puede venir a mano variante
  • , opcional - como usted ya se indicó
  • Matemáticas - cuaterniones, funciones matemáticas extra (aunque pueden no serle útiles)
  • lambda: aunque la sintaxis es peluda, es bastante adictiva
  • operadores/iteradores: son realmente útil en la construcción de sus propios tipos de

Tal Python (nunca intentaron, pero algunos, por ejemplo. programas de KDE usan)

4

Personalmente pienso que usted debe echar un vistazo a las bibliotecas que oculta cosas específicas plataforma como roscado, ipc, la memoria, los archivos del sistema de archivos, etc. asíncrono IO

Estos le puede ahorrar un montón de mapeado tiempo y problemas en proyectos multiplataforma y tiende a centrarse en la exposición de la funcionalidad en lugar de ejercicios en las sofisticadas características de C++.

+1

Como comentario general, creo que es perfecto.Pero al igual que los indicadores inteligentes, mi grupo tiene un marco maduro que incluye hardware y abstracción de sistemas de archivos, portabilidad de datos entre redes, etc. De ahí el interés en conceptos de alto nivel. –

13

He encontrado boost ser un indiscutible imprescindible en el diseño de plataforma cruzada (por ejemplo, * nix y Win32) aplicaciones multi-hilo (boost::thread, boost::interprocess.) Esta justificación solo ha sido suficiente en al menos un caso de adoptando boost como parte de los proyectos de mis empleadores.

El resto (contenedores, programación genérica y meta-programación, memoria) seguido como regalos.

3

Si necesita analizar los archivos de texto que son más complejos que los pares de clave/valor simples, recomiendo Boost::spirit. Tiene una gran curva de aprendizaje, pero una vez que lo resuelves, te permite incorporar fácilmente las gramoras EBNF directamente en el código. Es mucho más robusto que escribir tu propio analizador. También me encuentro creando formatos de archivo que están diseñados más para la facilidad del escritor del archivo que para el escritor del código de análisis.

2

he encontrado boost.thread y boost.asio indispensable para la creación de aplicaciones cliente/servidor. La biblioteca del puntero inteligente facilita la escritura de código que utiliza el manejo de excepciones sin pérdida de memoria.

En una nota al margen, recientemente se ha lanzado un conjunto de archivos PDF que documentan algunas de las bibliotecas de impulso más comunes. Puede descargarlos desde SourceForge.

+0

Lo descargué y analizando algunas de las librerías para las que ya he escrito programas de juguete, parece que solo se trata de archivos PDF de la documentación que se incluye con las bibliotecas de Boost. ¿No es así para algunos de ellos? –

+0

No, eso es todo lo que tengo, que yo sepa. –

2

He leído las otras respuestas e I necesito para agregar Boost.Graph (BGL) y su amigo Boost.Property_map. Estos dos literalmente cambiaron mi trabajo diario.

Está muy bien diseñado, pero la mayoría de la gente se desanima al principio porque hay un precio bastante alto que pagar antes de comprender realmente el propósito de todos los conceptos. Pero una vez que controlas esta biblioteca, es difícil prescindir de ella.

Cuestiones relacionadas