¿Cómo obtengo el tipo de una variable?

En C ++, ¿cómo se puede encontrar el tipo de variable?

Puede usar el operador typeid :

#include  ... cout < < typeid(variable).name() << endl; 

Para una inserción estática, C ++ 11 introdujo decltype que es bastante útil en ciertos escenarios.

Usualmente, querer encontrar el tipo de variable en C ++ es la pregunta incorrecta. Tiende a ser algo que llevas consigo de los lenguajes de procedimiento, como por ejemplo C o Pascal.

Si desea codificar comportamientos diferentes según el tipo, intente aprender sobre, por ejemplo , la sobrecarga de funciones y la herencia de objetos . Esto no tendrá un sentido inmediato en su primer día de C ++, pero sígalo.

Si tienes una variable

 int k; 

Puedes obtener su tipo usando

 cout < < typeid(k).name() << endl; 

Ver el siguiente hilo en SO: pregunta similar

La principal diferencia entre C ++ y Javascript es que C ++ es un lenguaje de tipo estático, wile javascript es dynamic.

En los lenguajes tipados dynamics, una variable puede contener cualquier cosa, y su tipo viene dado por el valor que posee, momento a momento. En los lenguajes tipados estáticos, el tipo de variable se declara y no puede cambiar.

Puede haber despacho dynamic y composición y subtipificación de objetos (herencia y funciones virtuales), así como envío estático y supertyping (a través de la plantilla CRTP), pero en cualquier caso el tipo de la variable debe ser conocido por el comstackdor.

Si está en la posición de no saber qué es o qué podría ser, es porque ha diseñado algo, ya que el lenguaje tiene un sistema de tipos dynamic.

Si ese es el caso, es mejor que re-piense su diseño, ya que está yendo a un país que no es natural para el idioma que está usando (más como ir en una autopista con una oruga, o en el agua con un automóvil)

No estoy seguro si mi respuesta ayudaría.

La respuesta corta es que realmente no necesita / quiere saber el tipo de variable para usarla.

Si necesita dar un tipo a una variable estática, entonces simplemente puede usar auto.

En un caso más sofisticado en el que desee utilizar “auto” en una clase o estructura, sugeriría usar la plantilla con decltype.

Por ejemplo, supongamos que está utilizando la biblioteca de otra persona y tiene una variable llamada “unknown_var” y desea ponerlo en un vector o estructura, puede hacer esto por completo:

 template  struct my_struct { int some_field; T my_data; }; vector complex_vector; vector > simple_vector 

Espero que esto ayude.

EDITAR: para una buena medida, este es el caso más complejo en el que puedo pensar: tener una variable global de tipo desconocido. En este caso necesitaría c ++ 14 y variable de plantilla.

Algo como esto:

 template vector global_var; void random_func (auto unknown_var) { global_var.push_back(unknown_var); } 

Todavía es un poco tedioso, pero es lo más cercano que se puede llegar a los idiomas sin tipo. Solo asegúrese de que siempre que haga referencia a la variable de la plantilla, siempre coloque allí la especificación de la plantilla.

Creo que tengo un caso de uso válido para usar typeid (), del mismo modo que es válido para usar sizeof (). Para una función de plantilla, necesito un caso especial del código basado en la variable de plantilla, de modo que ofrezco la máxima funcionalidad y flexibilidad.

Es mucho más compacto y fácil de mantener que el uso de polymorphism, para crear una instancia de la función para cada tipo compatible. Incluso en ese caso, podría usar este truco para escribir el cuerpo de la función una sola vez:

Tenga en cuenta que debido a que el código usa plantillas, la instrucción switch a continuación debe resolverse estáticamente en un solo bloque de código, optimizando todos los casos falsos, AFAIK.

Considere este ejemplo, donde podemos necesitar manejar una conversión si T es un tipo frente a otro. Lo uso para la especialización de clase para acceder al hardware donde el hardware usará myClassA o myClassB type. En una discrepancia, necesito dedicar tiempo a convertir los datos.

 switch ((typeid(T)) { case typeid(myClassA): // handle that case break; case typeid(myClassB): // handle that case break; case typeid(uint32_t): // handle that case break; default: // handle that case } 
 #include  ... string s = typeid(YourClass).name()