2010-10-07 2 views
9

В настоящее время я пытаюсь отладить часть простого кода и хочу видеть, как изменяется тип переменной во время программы.typeinfo/typeid output

Я использую заголовочный файл typeinfo, поэтому я могу использовать typeid.name(). Я знаю, что typeid.name() является специфичным для компилятора, поэтому вывод может быть не особенно полезным или стандартным.

Я использую GCC, но я не могу найти список потенциальных выходных данных, несмотря на поиск, предполагая, что существует список выходных символов typeid. Я не хочу делать какие-либо кастинга на основе вывода или манипулировать любыми данными, просто следуйте его типу.

#include <iostream> 
#include <typeinfo> 

int main() 
{ 
    int a = 10; 
    cout << typeid(int).name() << endl; 
} 

Есть ли список символов в любом месте?

+0

может быть, стоит отметить, что это GCC поставляется с MinGW. – aLostMonkey

+1

, если вы просто хотите следовать типам, то как насчет 'if (typeid (a) == typeid (int)) {/ * action * /}'? – Donotalo

+0

Что вы пытаетесь сделать? Что вы подразумеваете под символьным списком? – sellibitze

ответ

15

Я не знаю, если такой список существует, но вы можете сделать небольшую программу, чтобы распечатать их:

#include <iostream> 
#include <typeinfo> 

#define PRINT_NAME(x) std::cout << #x << " - " << typeid(x).name() << '\n' 

int main() 
{ 
    PRINT_NAME(char); 
    PRINT_NAME(signed char); 
    PRINT_NAME(unsigned char); 
    PRINT_NAME(short); 
    PRINT_NAME(unsigned short); 
    PRINT_NAME(int); 
    PRINT_NAME(unsigned int); 
    PRINT_NAME(long); 
    PRINT_NAME(unsigned long); 
    PRINT_NAME(float); 
    PRINT_NAME(double); 
    PRINT_NAME(long double); 
    PRINT_NAME(char*); 
    PRINT_NAME(const char*); 
    //... 
} 
+0

большое спасибо, не слишком уверен, почему это не перешло мне в голову. Это прекрасно работает. – aLostMonkey

+5

'template void PRINT_NAME() {std :: cout << ...}' – Potatoswatter

+0

@Potatoswatter и как вы создаете T? вы решение менее мощное, чем Bens's. –