"typeid" против "typeof" в C++

мне интересно, в чем разница между typeid и typeof В C++. Вот что я знаю:--8-->

  • typeid упоминается в документации к type_info, который определен в заголовочном файле c++объект TypeInfo.

  • typeof определяется в расширении GCC для C и в C++ Boost библиотека.

кроме того, вот тестовый тест кода, который я создал где я это обнаружил!--2--> не возвращает то, что я ожидал. Почему?

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)  
 }  

выход:

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

6 ответов


язык C++ не имеет такой вещи, как typeof. Вы, должно быть, смотрите на какое-то расширение для компилятора. Если вы говорите о GCC typeof, то аналогичная функция присутствует в C++11 через ключевое слово decltype. Опять же, C++ не имеет такого typeof ключевое слово.

typeid - оператор языка C++, который возвращает идентификационную информацию типа во время выполнения. Он в основном возвращает type_info объект, который равен-сопоставим с другими type_info объекты.

обратите внимание, что единственное определенное свойство возвращаемого type_info объект имеет то, что его равенство-и неравенство-сопоставимо, т. е. type_info объекты, описывающие различные типы, сравниваются неравными, в то время как type_info объекты, описывающие один и тот же тип надо сравнивать равные. Все остальное определяется реализацией. Методы, которые возвращают различные "имена", не гарантируют возврата чего-либо читаемого человеком и даже не гарантируют возврата чего-либо в все.

обратите внимание также, что вышеизложенное, вероятно, подразумевает (хотя стандарт, похоже, не упоминает об этом явно), что последовательные приложения typeid к тому же типу могут возвращать разные type_info объекты (которые, конечно, все равно придется сравнивать равные).


основное различие между ними состоит в следующем

  • typeof-это конструкция времени компиляции и возвращает тип, определенный во время компиляции
  • typeid является конструкцией времени выполнения и, следовательно, дает информацию о типе времени выполнения значения.

тип ссылки:http://www.delorie.com/gnu/docs/gcc/gcc_36.html

ссылка typeid:https://en.wikipedia.org/wiki/Typeid


typeid может работать во время выполнения и возвращать объект, описывающий тип времени выполнения объекта, который должен быть указателем на объект класса с виртуальными методами для RTTI (информация о типе времени выполнения) для хранения в классе. Он также может дать тип времени компиляции выражения или имя типа, если не указан указатель на класс с информацией о типе времени выполнения.

typeof является расширением GNU и дает вам тип любого выражения во время компиляции. Это может быть полезно, например, при объявлении временных переменных в макросах, которые могут использоваться для нескольких типов. В C++, вы обычно используете шаблоны.


отвечая на дополнительный вопрос:

мой следующий тестовый код для typeid делает не выводите правильное имя типа. что случилось?

нет ничего плохого. Вы видите строковое представление имени типа. Стандартный C++ не заставляет компиляторы выдавать точное имя класса, это просто до реализации(поставщика компилятора), чтобы решить, что подходит. Короче говоря, имена до компилятор.


это два разных инструмента. typeof возвращает тип выражения, но он не является стандартным. В C++0x есть что-то под названием decltype который выполняет ту же работу AFAIK.

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

, тогда как typeid используется с полиморфными типами. Например, скажем, что cat выводит 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 предоставляет тип данных во время выполнения, когда его просят. Typedef-это конструкция времени компиляции, которая определяет новый тип, как указано после этого. В C++нет typeof Вывод отображается как (показано как записанные комментарии):

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

Вы можете использовать Boost demangle для выполнения красивого имени:

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

и что-то вроде

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