tipos resueltos programas principiantes para lenguaje ejercicios ejemplos declaracion datos comandos avanzados c++ boost types typeid typeinfo

resueltos - ¿Existe un contenedor portátil para C++ type_info que estandarice el formato de cadena de nombre de tipo?



programas en c++ ejemplos avanzados (3)

El formato de la salida de type_info::name() es específico de la implementación.

namespace N { struct A; } const N::A *a; typeid(a).name(); // returns e.g. "const struct N::A" but compiler-specific

¿Alguien ha escrito un contenedor que devuelve información de tipo fiable y predecible que es la misma en todos los compiladores? Varias funciones con plantillas permitirían al usuario obtener información específica sobre un tipo. Entonces podría usar:

MyTypeInfo::name(a); // returns "const struct N::A *" MyTypeInfo::base(a); // returns "A" MyTypeInfo::pointer(a); // returns "*" MyTypeInfo::nameSpace(a); // returns "N" MyTypeInfo::cv(a); // returns "const"

Estas funciones son solo ejemplos, alguien con un mejor conocimiento del sistema de tipo C ++ probablemente podría diseñar una mejor API. El que me interesa en base() . Todas las funciones generarían una excepción si se deshabilitaba RTTI o si se detectaba un compilador no compatible.

Esto parece ser el tipo de cosas que Boost podría implementar, pero no puedo encontrarlo allí en ninguna parte. ¿Hay una biblioteca portátil que hace esto?


Existen algunas limitaciones para hacer tales cosas en C ++, por lo que probablemente no encontrará exactamente lo que quiere en el futuro cercano. La metainformación sobre los tipos que el compilador inserta en el código compilado también es específica de la implementación del RTL utilizado por el compilador, por lo que sería difícil para una biblioteca de terceros hacer un buen trabajo sin depender de las características no documentadas de cada compilador específico que podría romperse en versiones posteriores.

El marco de Qt tiene, que yo sepa, lo más cercano a lo que pretendía. Pero lo hacen completamente independiente de RTTI. En cambio, tienen su propio "compilador" que analiza el código fuente y genera módulos fuente adicionales con la metainformación. Luego, compila + vincula estos módulos junto con su programa y usa su API para obtener la información. Eche un vistazo a http://doc.qt.nokia.com/latest/metaobjects.html



Jeremy Pack (del marco del complemento Boost Extension) parece haber escrito algo así:

http://blog.redshoelace.com/2009/06/resource-management-across-dll.html

3. RTTI no siempre funciona como se espera a través de los límites de DLL. Mira las clases de type_info para ver cómo me ocupo de eso.

Para que puedas echar un vistazo allí.

PD. Lo recordé porque una vez arreglé un error en esa área; esto aún podría agregar información, así que aquí está el enlace: https://.com/a/5838527/85371