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.
No creo que eso sea posible. Pero la verdadera pregunta es, ¿qué harías con tal función? – Nawaz
Además, ¿por qué solo tendrías 'type_info's? – mfontanini
"Esto funciona bien si realmente conoces los tipos A y B".Ok, pero ¿cómo es que no sabes los tipos? – jrok