Me pregunto cuál es la diferencia entre typeid
y typeof
en C++. Esto es lo que sé:'typeid' versus 'typeof' en C++
typeid
se menciona en la documentación para 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í es prueba de código de prueba que he creado, donde he descubierto 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
¿De qué manera cree usted que su código no imprime los nombres de los tipos adecuados? Se ve bien para mi. La cadena real devuelta por 'name()' está definida por la implementación. No tiene que ser un nombre de identificador de C++ válido, simplemente * algo * que identifica de manera única el tipo. Parece que su implementación utiliza el esquema general de creación de nombres del compilador. –
Gracias Rob! Esperaba que fueran exactamente los mismos que los nombres de tipo que vi en en.wikipedia.org/wiki/Typeid. ¿Qué puede hacer mangear nombres aquí? – Tim