library c++ boost

boost library c++ download



Boost considerado daƱino? (19)

Muchas de las respuestas a las preguntas de C ++ aquí contienen la respuesta:

"Deberías usar boost: :( inserta tu puntero inteligente favorito aquí) o incluso mejor impulsar: :( inserta tu tipo de impulso mega complejo favorito aquí"

No estoy del todo convencido de que esto esté haciendo ningún favor a los interrogadores que, en general, son obvios novatos en C ++. Mis razones son las siguientes:

  • El uso de punteros inteligentes sin entender lo que está pasando bajo el capó va a conducir a una generación de programadores de C ++ que carecen de algunas de las habilidades básicas de un programador. Parece que casi todo esto ya pasó en el campo de Java.

  • Decidir qué tipo de puntero inteligente usar depende en gran medida del dominio del problema al que se dirige. Esto casi siempre falta en las preguntas que se publican aquí, por lo que simplemente decir "usar un puntero compartido" es, al menos, inútil y posiblemente totalmente incorrecto.

  • Boost aún no forma parte del estándar de C ++ y es posible que no esté disponible en la plataforma específica que utiliza el interrogador. Instalarlo es un poco doloroso (acabo de hacerlo con Jam ) y es excesivo si lo único que quieres son unos pocos punteros inteligentes.

  • Si está escribiendo código FOSS , no desea que el código dependa en gran medida de bibliotecas externas que, una vez más, sus usuarios pueden no tener. Me he visto pospuesto usando el código FOSS en varias ocasiones simplemente debido a la complejidad bizantina de las dependencias entre bibliotecas.

Para concluir, no estoy diciendo que no recomiende Boost, pero que deberíamos tener más cuidado al hacerlo.


No estoy del todo convencido de que esto esté haciendo ningún favor a los interrogadores que, en general, son obvios novatos en C ++. ...:

  • El uso de punteros inteligentes sin entender lo que está pasando bajo el capó va a conducir a una generación de programadores de C ++ que carecen de algunas de las habilidades básicas de un programador.

¿Les decimos a los programadores principiantes que deben aprender el lenguaje ensamblador antes de que puedan leer en los lenguajes de programación modernos? Claramente, no saben lo que está sucediendo bajo el capó.

¿Debería "Hello World" incluir una implementación del subsistema de E / S?

Personalmente, aprendí a construir objetos antes de aprender a escribir clases. Creo que aprendí a usar vectores STL antes de aprender matrices estilo C. Creo que es el enfoque correcto: "aquí es cómo referirme a varias variables casi idénticas usando std::vector , luego le mostraré lo que se barrió debajo de la alfombra mediante matrices de estilo C y new[] y delete[] ".


¿Sabes cómo funciona el compilador? ¿Sabes cómo funciona el sistema operativo? ¿Sabes cómo funciona el procesador? ¿Sabes cómo funciona la electrónica? ¿Sabes cómo funciona la electricidad?

En algún momento está usando una caja negra, la pregunta es, "¿es mi ignorancia problemática para lo que estoy haciendo actualmente?".

Si tiene gusto por el conocimiento, eso es algo grandioso, y lo considero una ventaja cuando entreviste ingenieros, pero no olvide la finalidad de su trabajo: crear sistemas que resuelvan problemas.


Boost es una gran biblioteca. Realmente espero que crezca en amplitud y aceptación. Úselo, extiéndalo y promociónelo.

Una de las mejores cosas de la comunidad .NET es que tiene una gran biblioteca de clase base. Uno de los problemas fundamentales de C ++, creo, es la biblioteca estándar minimalista de C ++. En cualquier lugar que vaya a desarrollar código, FOSS o corporativo, hay alguna selección de bibliotecas que se utilizan ya que no hay una biblioteca estándar amplia. Entonces terminas siendo un programador INSERT_YOUR_COMPANY_HERE C ++ y no necesariamente transferible. Sí, diseñaste la transferencia de habilidades de arquitectura, pero existe la curva de aprendizaje con la familiarización con el conjunto de bibliotecas que está usando el siguiente lugar. Donde, como desarrollador de .NET, básicamente se utilizará la misma biblioteca de clases y se podrá comenzar a ejecutar. Además, las bibliotecas que están construidas (y reutilizadas) tienen una base más amplia para construir.

Solo como un lado, puedes usar http://codepad.org para un contenedor de pegar código y ¡es compatible con boost!


C ++ no es un lenguaje amigable para principiantes. Con disculpas a Scott Meyers, un principiante no está aprendiendo solo un idioma con C ++, sino cuatro:

  1. Las partes C
  2. Partes orientadas a objetos: clases, herencia, polimorfismo, etc.
  3. El STL: contenedores, iteradores, algoritmos
  4. Plantillas y metaprogramación

Yo diría que si el principiante ya está escalando esta montaña, deberían apuntar hacia los aspectos más "modernos" de C ++ desde el principio. Hacer lo contrario significa que el principiante aprenderá C-ish C ++ con punteros regulares, pérdidas de recursos, etc. Se encuentran en un mundo de dolor, y luego descubren Boost y otras bibliotecas como una forma de detener el dolor.

Es una imagen complicada sin importar qué, así que ¿por qué no apuntarlos en una dirección que tiene un beneficio positivo para el esfuerzo mental invertido?

En cuanto a las dependencias, una gran cantidad de Boost es solo encabezado. Y la licencia liberal de Boost debería permitir su inclusión en casi cualquier proyecto.


Creo que estás mezclando muchas preocupaciones diferentes, no todas relacionadas específicamente con Boost:

En primer lugar, ¿deberían los programadores (o los novatos de C ++ específicamente) ser alentados a usar bibliotecas, modismos, paradigmas, idiomas o características del idioma que no entienden?

  • No claro que no. Cada programador debe comprender las herramientas que utilizan, especialmente en un lenguaje como C ++. Sin embargo, no veo muchas preguntas aquí en SO, donde se alienta a las personas a no entender el código que están usando. Cuando la gente dice que quiere hacer X en C ++, creo que es para decir "Boost tiene una implementación de X que funciona, que es más de lo que haría una solución casera, así que úsala".

Por supuesto, si la pregunta es "¿cómo funciona X?", La pregunta no puede responderse con "usar la implementación de Boost". Pero realmente no veo el problema al recomendar Boost para el primer tipo de preguntas.

Tampoco veo cómo es posible usar Boost sin entender lo que sucede debajo del capó. C ++, con o sin Boost, no es Java. Usar Boost de ninguna manera lo protege de las complejidades del lenguaje. Todavía tiene que preocuparse por los constructores de copia, aritmética de punteros, plantillas y todo lo demás que puede explotar en su cara.

Esto no es como lo que sucedió en Java. Diseñaron un lenguaje que eliminó todas las sutilezas. Boost no hace eso. Muy por el contrario, ha sido pionera en nuevos lenguajes y técnicas en programación genérica. Usar Boost no siempre es simple.

Sobre la disponibilidad de Boost, creo que no es un problema. Está disponible en las plataformas utilizadas en la gran mayoría de las preguntas, y si no pueden usar Boost, la sugerencia aún no es dañina , solo inútil.

Además, la mayoría de las bibliotecas de Boost son solo de encabezado y no requieren que instales todo. Si solo quieres punteros inteligentes, simplemente incluye esos encabezados y nada más.

Acerca de FOSS, usted tiene un punto en algunos casos, pero yo diría que esto es un problema para las bibliotecas menos universales que los usuarios no tienen . Pero Boost es extremadamente común, y si las personas no lo tienen, deberían obtenerlo, ya que es aplicable a casi cualquier dominio problemático. Y, por supuesto, la licencia es compatible con cualquier proyecto de FOSS que desee mencionar. Prefiero trabajar en un proyecto de OSS que usó Boost para hacer el trabajo pesado que uno que reinventó sus propias ruedas (buggy y patentadas), con curvas de aprendizaje pronunciadas que podrían haberse evitado.

Entonces, sí, en algunos casos, recomendar Boost no es útil. Pero no veo cómo puede ser dañino.

En cualquier caso, no veo cómo puede ser ni la mitad de dañino que enseñar a los principiantes a hacer su propio trabajo . En C ++, esa es una receta para el desastre. Es la única razón por la cual C ++ todavía tiene una reputación de ser propenso a errores y producir software defectuoso. Porque durante demasiado tiempo, las personas escribieron todo desde cero, desconfiando de la biblioteca estándar, desconfiando del código de terceros, desconfiando de todo lo que no era legal en C.


Creo que impulsar es una gran biblioteca. Lo amo. Mi biblioteca favorita es boost :: bind y boost :: function, que hacen que los punteros a las funciones sean mucho más flexibles y fáciles de usar. Encaja muy bien con diferentes marcos y mantiene el código ordenado.

También uso diferentes clases de Boost. Por ejemplo, uso boost :: graph para crear clases de gráficos y uso boost :: filesystem para trabajar con archivos dentro de directorios.

Sin embargo, el impulso es muy complejo. Necesita ser un programador experimentado para conocer su valor. Además, necesitas tener al menos algo de experiencia en C ++ para entender cómo funciona Boost y las implicaciones del uso de Boost aquí o allá.

Por lo tanto, recomendaría encarecidamente buscar Boost para programadores experimentados, especialmente si están tratando de reinventar la rueda (nuevamente). Realmente puede ser lo que dice en la lata: un impulso hacia su objetivo.

Sin embargo, si sientes que la persona que hace una pregunta es un principiante y trata de entender (por ejemplo) la asignación de memoria, decirle que intente aumentar los indicadores inteligentes es una muy mala idea. No es útil en absoluto. Las ventajas de las clases de punteros inteligentes, etc. se pueden comprender solo cuando la persona experimenta cómo funcionan las técnicas estándar de asignación de memoria.

Para finalizar, Boost no es como aprender a conducir un automóvil con caja de cambios automática. Es como aprender a conducir en un auto de carreras de F1.


Deberíamos alentar el uso de bibliotecas enlatadas estándar (y Boost es casi tan estándar como lo son) siempre que sea posible.

Algunas personas parecen pensar que a los principiantes se les debe enseñar el lado C de C ++ primero, y luego se les debe introducir en el nivel superior más adelante. Sin embargo, las personas tienden a trabajar mientras están entrenadas, por lo que vamos a ver una gran cantidad de código de producción escrito con punteros crudos mal administrados (punteros crudos bien administrados son terriblemente difíciles a veces), matrices (y la inevitable confusión entre eliminar y eliminar []), y cosas así. He trabajado con código así. No quiero volver a hacerlo más de lo necesario.

Comience a principiantes con la forma que desee de escribir código. Esto significa enseñarles sobre los contenedores y algoritmos de STL y algunas de las bibliotecas de Boost al principio, así que lo primero que piensan cuando necesitan un grupo de cosas es un vector <>. Luego, enséñeles los constructos de nivel más bajo, para que los conozcan (o dónde buscarlos) cuando los encuentren, o en las raras ocasiones en que necesitan micro-optimizar.

Básicamente hay dos tipos de programadores: los programadores, a quienes se les debe enseñar idiomas de la forma en que deberían escribirlos, y los entusiastas, que aprenderán las cosas de bajo nivel, incluidos los principios de los sistemas operativos, C, código ensamblador, etc. . Ambos están bien atendidos al aprender el idioma que van a utilizar por adelantado, mientras que solo los entusiastas estarán bien atendidos al aprender de un nivel arbitrario de fundamentos.


El consenso entre casi todas las respuestas es que el impulso es muy valioso para los desarrolladores experimentados y para el complejo, el mundo real, el software C ++. Estoy completamente de acuerdo.

También creo que el impulso puede ser muy valioso para los principiantes. ¿No es más fácil usar lexical_cast que usar ostringstream? ¿O para usar BOOST_FOREACH en lugar de la sintaxis del iterador? El gran problema es la falta de una buena documentación de impulso, especialmente para principiantes. Lo que se necesita es un libro que le diga cómo comenzar con el impulso, qué bibliotecas son bibliotecas simples que simplifican las tareas y qué bibliotecas son más complejas. Al usar estas bibliotecas junto con una buena documentación, IMO hará que el aprendizaje de C ++ sea más fácil.


Estoy de acuerdo con el punto acerca de los indicadores inteligentes. Soy un principiante de C ++, y al hacer una simple pregunta sobre la sintaxis del puntero, una answer sugería que los punteros inteligentes fueran el camino a seguir. Sé que no estoy listo para el impulso (tampoco estoy realmente preparado para el STL), así que en la mayoría de los casos me alejo de ese tipo de sugerencias.


Estoy de acuerdo contigo, las bibliotecas de alto nivel te ocultan cosas. Puede ser una buena idea a corto plazo, pero a la larga, el novato tendrá graves deficiencias en su comprensión del idioma.

Para los que no somos novatos, es fácil decir "solo use esta biblioteca" porque hemos pasado por ese difícil camino de aprender las cosas de la manera difícil, y naturalmente queremos salvar a alguien el problema de hacer lo mismo.

Los novatos DEBERÍAN tener que luchar para lanzar sus propias soluciones de bajo nivel a los problemas. Y luego, cuando comprendan mejor cómo funcionó su propia solución, pueden usar la solución de terceros, seguros de que tienen una idea de lo que sucede bajo el capó. ¡Usarán esa biblioteca mejor!

Creo que este es un tema más amplio que simplemente hablar sobre Boost. Me arrepiento por completo de haber elegido VB como mi primer idioma. Si hubiera empezado con c fea, difícil de aprender, estaría años por delante de donde estoy ahora.


Estoy en desacuerdo. Nadie sugeriría que debas sumergirte en punteros inteligentes sin un conocimiento profundo de lo que ocurre detrás de escena, pero que se usen con sensatez para eliminar una gran cantidad de errores comunes. Además, Boost es un código de producción de alta calidad del que un novato de C ++ puede aprender mucho, tanto en términos de diseño como de implementación. Tampoco es demasiado complicado, y puedes elegir los bits que necesitas.


Estoy en desacuerdo. Por supuesto, siempre sabrá más sobre el funcionamiento interno de todo al codificarlo desde cero que al usar bibliotecas de terceros. Pero el tiempo y el dinero son limitados, y el uso de buenas bibliotecas de terceros como el impulso es una muy buena manera de guardar sus recursos.


Francamente, para los principiantes creo que el impulso no es tan adecuado. Creo que es mejor para un principiante entender cómo funcionan los conceptos básicos antes de avanzar en la cadena alimenticia usando herramientas / libs de nivel superior como boost o incluso STL. En la etapa de principiante no se trata de productividad, sino de comprensión. Creo que saber cómo funcionan los punteros, por ejemplo, crear manualmente una lista vinculada u ordenarla son parte de los fundamentos que cada programador debe aprender.


He trabajado para compañías que han visto impulsar como biblioteca para evitar debido en parte a su reputación pasada como un proyecto mal administrado. Sé que las cosas han cambiado con el proyecto, pero los proyectos comerciales que quieran usar boost deben conocer la fuente del código que se encuentra en la biblioteca, o al menos tener la seguridad de que no serán responsables de las infracciones de IP o patentes. .

Lamentablemente, la biblioteca tiene esta reputación y tardará un tiempo en romperse antes de que tenga un amplio uso en el sector comercial. También siento que esta es una razón para no recomendarlo a ciegas.


La propiedad acotada y dinámica de los recursos son requisitos básicos generales y la implementación de boost de ellos es muy buena y muy recomendable. Los uso mucho y funcionan bien.


Pocos puntos:

  • Usar cualquier cosa sin entender se considera dañino. Pero es solo el usuario de tecnología ignorante (y su gerente) quien se quema al final.
  • No es necesario que instale boost para obtener los punteros inteligentes, solo son encabezados. Y la instalación en sí es bastante sencilla, en el enfoque más simple simplemente escribiendo uno o dos comandos.
  • Muchas de las bibliotecas y soluciones de Boost están presentes en TR1 o estarán presentes en C ++ 0x
  • Siempre dependerá de las bibliotecas externas ... Intente elegir la que tenga un futuro brillante en términos de mantenimiento y soporte.
  • A menos que desee implementar su solución personalizada, lo que tendría algunas ventajas y desventajas.

Puedo ver tu punto, pero entender algo no significa que tienes que volver a escribir todo desde cero.

No son "estándar" pero son lo más estándar que puede obtener una biblioteca.

Es cierto que desplegarlos puede ser doloroso (pero no todas las sub-bibliotecas requieren compilación); por otro lado, no tienen más dependencias por su cuenta, por lo que tampoco me preocuparía demasiado esa parte.


Estoy totalmente de acuerdo con usted. Es la razón por la que primero les explico cómo debe hacerse (es decir, cuando recomiendo la variante :: boost, les explico que en general deberían usar una unión discriminada. Y trato de no decir que es solo un "estímulo mágico", pero muestran cómo lo implementaron en principio. Cuando recomiendo boost :: shared_ptr, explico que necesitarían usar un puntero, pero es mejor usar un puntero inteligente que tenga semántica de propiedad compartida). Intento no decir solo "use boost::xxx " cuando veo que el que pregunta es un principiante. Es un lenguaje que no es tan simple de usar como algunos lenguajes de scripting. Uno tiene que entender lo que uno usa, porque el lenguaje no protege al programador de hacer cosas malas.

Por supuesto, no es posible que los principiantes entiendan todo desde el principio. Pero deben entender lo que resuelve su biblioteca de impulso y cómo lo hace básicamente.

No se puede comparar esto con los procesadores de aprendizaje o el lenguaje ensamblador primero. Similar no es importante saber cómo se ve el patrón de bits de un puntero nulo. El conocimiento de ellos es irrelevante en el aprendizaje de la programación con C ++. Pero los punteros, array u otras cosas básicas en C ++ no lo son. No se puede aprender antes de usar [boost|std]::shared_ptr o [boost|std]::array éxito. Estas son las cosas que deben entenderse primero para utilizar las utilidades de impulso con éxito en mi opinión. No se trata de detalles como la forma de implementar manualmente el idioma pimpl utilizando punteros crudos; ese no es el punto que estoy haciendo. Pero el punto es que primero uno debe saber cosas básicas sobre los punteros o las otras partes con las que ayuda una biblioteca de impulso (por ejemplo, qué son y para qué sirven, por ejemplo). Solo mire el manual shared_ptr e intente obtenerlo sin conocer los punteros. Es imposible.

Y es importante indicarles siempre el manual de impulso apropiado. Los manuales de Boost son de alta calidad.


  • Es imposible entender todo a fondo todo el tiempo. Así que tome la palabra de muchos desarrolladores profesionales de C ++ para que muchas partes de impulso sean de hecho cosas muy útiles para usar en su desarrollo diario.
  • La inclusión de un gran impulso en C ++ 0X es un testimonio de que incluso el equipo que maneja la evolución del lenguaje piensa que impulsar es algo bueno (tm)
  • C ++ es un lenguaje extraño y difícil. Es relativamente fácil de aprender en comparación con lo increíblemente difícil de dominar. Hay algunas cosas realmente arcanas que puedes hacer con eso. Boost :: mpl se basa en algunas de esas cosas arcanas. Me encanta impulsar, pero me estremezco cada vez que veo a alguien en mi organización usar boost :: mpl. La razón: incluso los desarrolladores bastante experimentados de C ++ tienen problemas para entender cómo funciona, y el código que lo usa a menudo refleja eso (termina pareciendo que alguien sacó el código hasta que funcionó). Esto no es algo bueno, por lo que estoy parcialmente de acuerdo en que algunas partes de boost no deberían usarse sin precaución (boost :: spirit es otro ejemplo).
  • El estándar C ++ también es algo extraño. Los compiladores más comunes no implementan todo el estándar existente (por ejemplo, exportación de plantillas). Es solo una guía de qué esperar.
  • Si su desarrollador no tiene la inteligencia para decidir qué puntero inteligente usar en una situación particular, tal vez no deberían estar metiéndose en esa parte del código sin una guía de alto nivel.
  • Siempre hay bibliotecas externas, comenzando con el tiempo de ejecución. Un gran impulso es solo encabezado, por lo que no introduce nuevas dependencias externas.