2009-04-23 8 views

Respuesta

6

Considero que Boost.Variant siempre debe ser preferido ya que no es intrusivo y aún requiere una programación muy estructurada.

Pero supongo que la idea principal detrás de boost.any es proporcionar el equivalente a los tipos de objetos java y C#. Es una forma de decir "sí, podemos". :-)

+4

Boost.Variant no puede reemplazar Boost.Any en caso de que se conozca el tipo que se va a guardar en tiempo de ejecución. Por ejemplo, vea el enlace al que se hace referencia en el comentario de SCFrench: http://www.ddj.com/cpp/184403808 –

+0

-1. Boost.any puede almacenar todos los tipos, incluso los primitivos, no solo los equivalentes de C#/java "objeto". – Macke

+0

@Macke No digas C#/java en este caso. C# (CLR) puede almacenar un valor primitivo en un objeto. Los idiomas pueden parecer similares, pero difieren. – erikkallen

21

boost :: any almacenará felizmente ints y flotadores, tipos que claramente no tienen clases base. Un ejemplo de la vida real donde puede usarlo es una máquina virtual para un lenguaje interpretado de alto nivel. Sus objetos de "función" necesitarán una matriz de argumentos. Esto se puede implementar fácilmente con un std::list<boost::any> detrás de escena.

3

¿Por qué no se pudo lograr la misma funcionalidad al tener algún tipo genérico en la raíz de la jerarquía del objeto y crear contenedores con ese tipo base?

Llama a una jerarquía de objetos - una construcción que está inyectando artificialmente en el diseño para resolver un problema periférico. Además, tal construcción es fácil de equivocarse y una implementación incorrecta puede causar estragos. Boost.Anyes una comunidad revisó una alternativa segura y probada.

¿Podría darme algunos ejemplos de la vida real?

TinyJSON utiliza boost.Any.

¿Cuáles son las ventajas de usar la biblioteca boost.any?

Me refiero a la documentación introductory.

+4

Representar JSON en C++ 'impulsar :: variante ' es en mi opinión la mejor opción. –

+1

No escribí esa biblioteca :-) Estoy seguro de que tienes razones válidas. – dirkgently

2

Usamos boost.any como el tipo de operador para un contenedor variadic etiquetado seguro. Esto es lo que eso significa:

Tenemos un objeto "balsa", que viaja a través de un conjunto de filtros. Cuando un filtro quiere añadir datos a la balsa, se puede hacer algo como esto:

raft.addTaggedData<ETag1>(3.0); 
raft.addTaggedData<ETag2>("a string")`; 
std::string str = raft.getTaggedData<ETag2>(); 
int a = raft.getTaggedData<ETag1>(); // <-- Compile error 

Dónde ETag1 y ETag2 son miembros de una enumeración, y utiliza una plantilla para trazar los rasgos de las etiquetas a los tipos.

La clase de balsas usa list de pair<ETagType, boost::any> como una tienda de respaldo. Boost.any nos ahorró la molestia de administrar buffers crudos para varios tipos.

+0

Usando un poco de boost.MPL, podrías usar boost.Variant en lugar de Boost.Any. –

+0

Incluso usando boost.any fue incluso un poco exagerado; mi equipo es bastante conservador en lo que respecta a las funciones de C++. Además, aún no aprendí MPL. :) –

+0

@ Benoît Boost.Variant requeriría que la balsa supiera todas las etiquetas posibles (o al menos sus tipos de valores). Esto podría no ser posible si, por ejemplo, la balsa flota a través de módulos independientes que podrían almacenar un tipo de datos privados de esta manera. O incluso si es posible, podría no ser deseado debido al aumento de las dependencias de origen implícitas de esta manera. Aunque Boost.Any aumenta los costos de tiempo de ejecución por lo que es una solución de compromiso. –

3

Lo hemos utilizado en un mapa de la propiedad, (std::map<std::string, boost::any>), para almacenar muchas cosas dinámicamente en un espacio de datos simple y plano.

Principalmente almacenamos objetos o cadenas de caracteres inteligentes-ptr-a-secuencias de comandos, pero algunas entradas tienen otros tipos (flotantes, vec3f, matrices y otros objetos no estándar).

funciona bastante bien para añadir más capacidades dinámicas para C++, o cualquier lugar algún tipo-borrado simplemente agregar cualquier tipo de datos a un objeto.

5

Cuando estaba aprendiendo acerca de Boost's encontré this article de Herb Sutter y Jim Hyslop en Dr. Dobbs. Lo encontré útil.

Cuestiones relacionadas