2012-07-03 19 views
56

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

+3

Posible duplicado de http://stackoverflow.com/questions/81870/print-variable-type-in-c – theharshest

+4

cout << typeid (variable) .name() << endl; – SRN

+0

Utilice la búsqueda o google :) http://stackoverflow.com/questions/81870/print-variable-type-in-c Theharrshest es rápido: D – Kariboo

Respuesta

71

Puede utilizar the typeid operator:

#include <typeinfo> 
... 
cout << typeid(variable).name() << endl; 
+4

Tengo 'int a = 5;' y 'typeid (a) .name()' y devuelve 'i' ... – 0x499602D2

+12

@David - Entonces' i' significa entero en su compilador. Los nombres devueltos no están especificados por el estándar. –

+6

Cuando lo uso en el vector , devuelve St6vectorIiSaIiEE. WTF? –

5

Si tiene una variable

int k; 

Usted puede obtener el tipo con

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

Ver el siguiente hilo de SO: Similar question

0
#include <typeinfo> 

... 
string s = typeid(YourClass).name() 
9

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

Si desea codificar diferentes comportamientos según el tipo, intente obtener más información acerca de, por ejemplo, el tipo de comportamiento. function overloading y object inheritance. Esto no tendrá un sentido inmediato en su primer día de C++, pero sígalo.

5

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

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

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

Si no puede saber qué es o qué podría ser, es porque ha diseñado algo, ya que el lenguaje tiene un sistema de tipos dinámico.

Si ese es el caso, es mejor que reconsidere 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 coche)

+0

Si C++ tiene el cambio dinámico, entonces creo que sería genial y typeof y parseInt, las funciones parseFloat también serán útiles, pero yo no ¡sé por qué los creadores de C++ lo hacen demasiado difícil, por ejemplo! quien dice que es bueno escribir cout << "String" – Waqas

+0

determinación es la mejor !!!! #include string str ("1912"); int strtointval; stringstream (str) >> strtointval; – Waqas

+0

@Waqas Uh, ¿qué? Las personas que dicen que es mejor son las personas que definen el idioma y la IMO tienen casi la última palabra en todo lo que tiene que ver con esto, buenas prácticas de codificación, por ejemplo. ¿Podrías reformular ese comentario para que tenga más sentido? –

1

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 polimorfismo, 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 solo una vez:

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

Considere este ejemplo, donde es posible que necesitemos 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 
} 
+1

TypeId: No pude usar typeid() en Arduino. Además, typeid() es una comprobación de * runtime *, no de compilación, por lo que no se puede utilizar para generar código optimizado. –

+1

Sí, no, esto no hace lo que pensaste que hacía. 'typeid' simplemente no puede ser una verificación estática en tiempo de compilación, por definición, por lo que no facilita la optimización. 'Para una función de plantilla, necesito un caso especial del código basado en la variable de la plantilla 'Derecha, entonces lo que realmente quiere es polimorfismo estático a través de la expresión CRTP. Esto es exactamente lo que logra. –

6

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

0

No estoy seguro de si mi respuesta podría ayudar.

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

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

En el caso más sofisticado en el que desea utilizar "auto" en una clase o estructura, le sugiero usar la plantilla con decltype.

Por ejemplo, digamos que usted está utilizando la biblioteca de otra persona y que tiene una variable llamada "unknown_var" y que le gustaría ponerlo en un vector o estructura, se puede hacer totalmente este:

template <typename T> 
struct my_struct { 
    int some_field; 
    T my_data; 
}; 
vector<decltype(unknown_var)> complex_vector; 
vector<my_struct<decltype(unknown_var)> > simple_vector 

Esperanza esto ayuda.

EDITAR: Para una buena medida, este es el caso más complejo que se me ocurre: tener una variable global de tipo desconocido. En este caso necesitaría C++ 14 y variable de plantilla.

Algo como esto:

template<typename T> vector<T> global_var; 

void random_func (auto unknown_var) { 
    global_var<decltype(unknown_var)>.push_back(unknown_var); 
} 

Es todavía un poco tedioso, pero es lo más cerca que se puede llegar a typeless idiomas. Solo asegúrese de que siempre que haga referencia a la variable de la plantilla, siempre coloque allí la especificación de la plantilla.

Cuestiones relacionadas