variable type print know how check c++ typeof typeid

print - type() c++



''typeid'' versus ''typeof'' en C++ (6)

El lenguaje C ++ no tiene tal cosa como typeof . Debe estar mirando alguna extensión específica del compilador. Si está hablando de typeof de GCC, una característica similar está presente en C ++ 11 a través de la palabra clave decltype . Nuevamente, C ++ no tiene tal tipo de typeof clave.

typeid es un operador de lenguaje C ++ que devuelve información de identificación de tipo en tiempo de ejecución. Básicamente devuelve un objeto type_info , que es comparable a la igualdad con otros objetos type_info .

Tenga en cuenta que la única propiedad definida del objeto type_info devuelto es su igualdad y no igualdad comparable, es decir, los objetos type_info que describen diferentes tipos deben comparar no iguales, mientras que los objetos type_info que describen el mismo tipo tienen que comparar equal. Todo lo demás está definido por la implementación. No se garantiza que los métodos que devuelven varios "nombres" devuelvan algo legible por el ser humano, e incluso no se garantiza que devuelva nada en absoluto.

Tenga en cuenta también que lo anterior probablemente implica (aunque el estándar no parece mencionarlo explícitamente) que las aplicaciones consecutivas de typeid al mismo tipo podrían devolver diferentes objetos type_info (que, por supuesto, todavía tienen que comparar iguales).

Me pregunto cuál es la diferencia entre typeid y typeof en C ++. Esto es lo que sé:

  • typeid se menciona en la documentación de type_info que se define en el archivo de cabecera C ++ typeinfo .

  • typeof se define en la extensión GCC para C y en la biblioteca C ++ Boost .

Además, aquí está la prueba del código de prueba que he creado donde descubrí que typeid no devuelve lo que esperaba. ¿Por qué?

main.cpp

#include <iostream> #include <typeinfo> //for ''typeid'' to work class Person { public: // ... Person members ... virtual ~Person() {} }; class Employee : public Person { // ... Employee members ... }; int main () { Person person; Employee employee; Person *ptr = &employee; int t = 3; std::cout << typeid(t).name() << std::endl; std::cout << typeid(person).name() << std::endl; // Person (statically known at compile-time) std::cout << typeid(employee).name() << std::endl; // Employee (statically known at compile-time) std::cout << typeid(ptr).name() << std::endl; // Person * (statically known at compile-time) std::cout << typeid(*ptr).name() << std::endl; // Employee (looked up dynamically at run-time // because it is the dereference of a pointer // to a polymorphic class) }

salida:

bash-3.2$ g++ -Wall main.cpp -o main bash-3.2$ ./main i 6Person 8Employee P6Person 8Employee


La principal diferencia entre los dos es la siguiente

  • typeof es una compilación en tiempo de compilación y devuelve el tipo como se definió en tiempo de compilación
  • typeid es una construcción en tiempo de ejecución y, por lo tanto, proporciona información sobre el tipo de tiempo de ejecución del valor.

typeof Refenence: http://www.delorie.com/gnu/docs/gcc/gcc_36.html

typeid Rfeerence: http://en.wikipedia.org/wiki/Typeid


Puedes usar Boost demangle para lograr un buen nombre:

#include <boost/units/detail/utility.hpp>

y algo así como

To_main_msg_evt ev("Failed to initialize cards in " + boost::units::detail::demangle(typeid(*_IO_card.get()).name()) + "./n", true, this);


Respondiendo a la pregunta adicional:

mi siguiente código de prueba para typeid no muestra el nombre de tipo correcto. ¿Qué pasa?

No hay nada malo Lo que ves es la representación de cadena del nombre de tipo. El C ++ estándar no obliga a los compiladores a emitir el nombre exacto de la clase, sino que depende del implementador (proveedor del compilador) decidir qué es lo adecuado. En resumen, los nombres dependen del compilador.

Estas son dos herramientas diferentes. typeof devuelve el tipo de una expresión, pero no es estándar. En C ++ 0x hay algo llamado decltype que hace el mismo trabajo AFAIK.

decltype(0xdeedbeef) number = 0; // number is of type int! decltype(someArray[0]) element = someArray[0];

Mientras que typeid se usa con tipos polimórficos. Por ejemplo, digamos que el cat deriva animal :

animal* a = new cat; // animal has to have at least one virtual function ... if( typeid(*a) == typeid(cat) ) { // the object is of type cat! but the pointer is base pointer. }


typeid proporciona el tipo de datos en tiempo de ejecución, cuando se le solicita. Typedef es una construcción de tiempo de compilación que define un nuevo tipo como se indica después de eso. No hay typeof en C ++ Output aparece como (se muestra como comentarios inscritos):

std::cout << typeid(t).name() << std::endl; // i std::cout << typeid(person).name() << std::endl; // 6Person std::cout << typeid(employee).name() << std::endl; // 8Employee std::cout << typeid(ptr).name() << std::endl; // P6Person std::cout << typeid(*ptr).name() << std::endl; //8Employee


http://en.wikipedia.org/wiki/Typeid puede operar en tiempo de ejecución y devolver un objeto que describa el tipo de tiempo de ejecución del objeto, que debe ser un puntero a un objeto de una clase con métodos virtuales para que RTTI (información de tipo de tiempo de ejecución) se almacene en la clase . También puede dar el tipo de tiempo de compilación de una expresión o un nombre de tipo, si no se le da un puntero a una clase con información de tipo de tiempo de ejecución.

typeof es una extensión de GNU y le proporciona el tipo de cualquier expresión en tiempo de compilación. Esto puede ser útil, por ejemplo, para declarar variables temporales en macros que pueden usarse en múltiples tipos. En C ++, generalmente usaría templates lugar.