En C++, ¿cómo se puede encontrar el tipo de variable?¿Cómo obtengo el tipo de variable?
Respuesta
Puede utilizar the typeid operator:
#include <typeinfo>
...
cout << typeid(variable).name() << endl;
Tengo 'int a = 5;' y 'typeid (a) .name()' y devuelve 'i' ... – 0x499602D2
@David - Entonces' i' significa entero en su compilador. Los nombres devueltos no están especificados por el estándar. –
Cuando lo uso en el vector
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
#include <typeinfo>
...
string s = typeid(YourClass).name()
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.
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)
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
determinación es la mejor !!!! #include
@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? –
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
}
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. –
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. –
Para una inserción C estática ++ 11 introducido decltype
que es bastante útil en ciertos escenarios.
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.
- 1. ¿Cómo verificar el tipo de variable? Python
- 2. ¿Cómo obtengo el tipo de columna de la tabla?
- 3. ¿Cómo obtengo una variable en otra actividad?
- 4. ¿Cómo obtengo el ícono asociado con un tipo de archivo?
- 5. ¿Cómo obtengo el tipo de valor en Scheme?
- 6. ¿Cómo obtengo el tipo de puntero en una plantilla?
- 7. ¿Cómo obtengo el valor predeterminado de un tipo genérico?
- 8. Cómo comprobar si el tipo de variable coincide con Tipo almacenado en una variable
- 9. Obtenga el tipo de una variable en VBScript
- 10. Dado un tipo ExpressionType.MemberAccess, ¿cómo obtengo el valor del campo?
- 11. Tipo tienda en el campo/variable de
- 12. ¿Cómo obtengo el nombre de tipo de un argumento de tipo genérico?
- 13. ¿Cómo obtengo el tipo de devolución de un tipo delegado a través de la reflexión?
- 14. Cómo determinar el tipo de datos de una variable
- 15. ¿Cómo obtener el tipo de datos de una variable uniforme
- 16. ¿Cómo obtengo una variable de un bloque try/catch?
- 17. Cómo refactorizar el tipo de variable en Eclipse?
- 18. ¿Cómo determinar el tipo primitivo de una variable primitiva?
- 19. ¿Cómo obtener el tipo de una variable en MATLAB?
- 20. ¿Cómo seleccionar el tipo de iterador usando la variable automática?
- 21. ¿Cómo se verifica el tipo de una variable local?
- 22. ¿Cómo obtengo íconos comunes de tipo de archivo en C#?
- 23. ¿Cómo obtengo el valor de MemberInfo?
- 24. Cómo convertir un tipo de variable Mat en un tipo de variable IplImage en OpenCV 2.0?
- 25. Tipo de contenido Django: ¿cómo obtengo un objeto?
- 26. tipo rígido error variable
- 27. Java "variable de tipo reciente"
- 28. ¿Cómo obtengo el nombre y el tipo de método de llamada usando la reflexión?
- 29. Obteniendo el tipo de variable en el código C
- 30. ¿Cómo obtengo una variable de "depuración" en el contexto de mi plantilla de Django?
Posible duplicado de http://stackoverflow.com/questions/81870/print-variable-type-in-c – theharshest
cout << typeid (variable) .name() << endl; – SRN
Utilice la búsqueda o google :) http://stackoverflow.com/questions/81870/print-variable-type-in-c Theharrshest es rápido: D – Kariboo