2012-05-08 8 views
5

En C++ 11 es posible determinar si una variable de tipo A puede convertirse implícitamente en tipo B por using std::is_convertible<A, B>.std :: is_convertible para type_info

Esto funciona bien si realmente conoces los tipos A y B, pero todo lo que tengo es type_infos. Así que lo que estoy buscando es una función como esta:

bool myIsConvertible(const type_info& from, const type_info& to); 

¿Es posible poner en práctica algo así como que en C++? ¿Si es así, cómo?

+5

No creo que eso sea posible. Pero la verdadera pregunta es, ¿qué harías con tal función? – Nawaz

+0

Además, ¿por qué solo tendrías 'type_info's? – mfontanini

+0

"Esto funciona bien si realmente conoces los tipos A y B".Ok, pero ¿cómo es que no sabes los tipos? – jrok

Respuesta

1

Supongo que esto podría hacerse en caso de que conozca el tipo de letra de su variable, que siempre puede saber utilizando el operador typeid en C++.

Derived* pd = new Derived; 
    Base* pb = pd; 
    cout << typeid(pb).name() << endl; //prints "class Base *" 
    cout << typeid(*pb).name() << endl; //prints "class Derived" 
    cout << typeid(pd).name() << endl; //prints "class Derived *" 

Entonces se tendría que crear un multimap o con llave como typeid (que desea saber si es convertible a) y valor como convertible type ids (tipo convertible) Cuando, como si. Aquí en este caso, entonces puede acceder al mapa para buscar si un key en su caso const type_info& from tiene un value mapeado a const type_info& to. Si es así, puede devolver bool como true o false. Pero en este caso debe asegurarse de ver todas las clases y su herencia en el código correctamente. Y sobre la base decide si será una conversión legal y agrega en el mapa sobre esa base. Pero este sería un proceso tedioso y no veo ningún uso de él.

Genrally C++ le informa a través de dynamic cast si un tipo puede ser enviado a otro tipo o no correctamente. Mientras que static_cast incluso arrojará tipos incomptables entre sí y el uso incorrecto de lo que llevaría a error en tiempo de ejecución

4

No es posible en C++ portátil hacer lo que desee.

Se puede ser posible lograr una respuesta parcial si que se limite a una plataforma determinada. Por ejemplo esas plataformas que se adhieren a la Itanium ABI tendrán una implementación de esta función:

extern "C" 
void* __dynamic_cast(const void *sub, 
        const abi::__class_type_info *src, 
        const abi::__class_type_info *dst, 
        std::ptrdiff_t src2dst_offset); 

En este ABI, abi::__class_type_info es un tipo derivado de std::type_info y todosstd::type_info s en el programa han derivado un tipo dinámico desde std::type_info (abi::__class_type_info siendo solo un ejemplo).

Usando esta ABI es posible construir una herramienta que navegue por la jerarquía de herencia de cualquier tipo (en tiempo de ejecución), dado su std::type_info. Y al hacerlo, podría determinar si dos std::type_info s representan dos tipos que podrían ser dynamic_cast o incluso static_cast entre sí.

Tenga en cuenta que una solución de este tipo no tendría en cuenta la conversión entre tipos utilizando un constructor de conversión o un operador de conversión. E incluso si esa restricción es aceptable, no recomiendo esta ruta. Este no es un proyecto fácil, y sería muy propenso a errores. Pero esta es probablemente la forma en que su implementación C++ implementa dynamic_cast, por lo que obviamente no es imposible.

Cuestiones relacionadas