Mi chiedo quale sia la differenza tra typeid
e typeof
in C++. Ecco quello che so:'typeid' contro 'typeof' in C++
typeid
è menzionato nella documentazione per type_info che è definito nel C++ file di intestazione typeinfo.typeof
è definito nell'estensione GCC per C e nella libreria C++ Boost.
Inoltre, qui è prova di codice di prova che ho creato in cui ho scoperto che typeid
non restituisce quello che mi aspettavo. Perché?
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)
}
uscita:
bash-3.2$ g++ -Wall main.cpp -o main
bash-3.2$ ./main
i
6Person
8Employee
P6Person
8Employee
In che modo pensi che il codice non stampa i nomi dei tipi giusti? Mi sembra buono La stringa effettiva restituita da 'name()' è definita dall'implementazione. Non deve essere un nome identificativo C++ valido, solo * qualcosa * che identifica univocamente il tipo. Sembra che la tua implementazione utilizzi lo schema generale di manipolazione dei nomi del compilatore. –
Grazie Rob! Mi aspettavo che fossero esattamente identici ai nomi dei tipi che ho visto in en.wikipedia.org/wiki/Typeid. Cosa può fare la manipolazione del nome qui? – Tim