2011-02-11 7 views
9

He almacenado un puntero a un objeto type_info.¿Cómo puedo encasillar con type_info?

int MyVariable = 123; 
const std::type_info* Datatype = &typeid(MyVariable); 

¿Cómo podría usar esto para escribir otra variable a ese tipo? He intentado esto, pero no funciona:

std::cout << ((*Datatype)3.14) << std::endl; 

Utilizando el formulario en función de encasillamiento no funciona, ya sea:

std::cout << (*Datatype(3.14)) << std::endl; 

Respuesta

4

No creo que se pueda hacer tal fundición. Supongamos que podría hacer fundición "dinámica" como esta en tiempo de ejecución (no quiere decir dynamic_cast). Luego, si usó el resultado del elenco para llamar a una función, el compilador ya no podría verificar el tipo de los parámetros y podría invocar una llamada a función que en realidad no existe.

Por lo tanto, no es posible que esto funcione.

+0

Si utiliza un estilo C o reinterpret_cast obtienes el mismo problema, así que no creo que sea un argumento válido. –

+1

@Mark Ransom El resultado de cualquiera de esos tipos de conversión es * conocido en tiempo de compilación *. El contenido de '* DataType' puede variar en tiempo de ejecución. –

+2

en ese punto, creo que estamos de acuerdo y lo dije en mi respuesta. Donde estoy en desacuerdo es que el problema de perder la verificación de tipo sería una razón para que esto no funcione. Si lanzas un 'foo *' a una 'barra * 'y llamas un método sobre él, puedes invocar una llamada a función que en realidad no existe, hoy, usando los moldes que mencioné. –

16

Simplemente no se puede hacer eso usando type_info. Además, en su ejemplo DataType no es tipo, es un puntero a un objeto del tipo type_info. No puedes usarlo para lanzar. La fundición requiere tipo, ¡no un puntero u objeto!


En C++ 0x, se puede hacer esto, sin embargo,

int MyVariable = 123; 

    cout << (decltype(MyVariable))3.14 << endl; 

    cout << static_cast<decltype(MyVariable)>(3.14) << endl; 

Salida:

3 
3 

Demo Online: http://www.ideone.com/ViM2w

+1

Blech. Otra razón para esperar C++ 0x. – Maxpm

+0

@Maxpm, gran parte de C++ 0x está disponible en Boost, así que fui a buscar: http://www.boost.org/doc/libs/1_35_0/doc/html/typeof.html –

+0

@Mark Ransom: creo 'Boost.Typeof' no es portable, o simplemente no funciona con todos los compiladores, ya que usa la extensión del compilador internamente. Consulte este tema: [¿Falta de operador typeof en C++ 03?] (Http://stackoverflow.com/questions/4533758/absence-of-typeof-operator-in-c03) – Nawaz

3

Encasillamiento no es un Run- proceso de tiempo, es un proceso en tiempo de compilación, al menos para el tipo que está lanzando a. No creo que se pueda hacer.

Cuestiones relacionadas