'идентификатор типа' по сравнению с 'typeof' в C++

Я задаюсь вопросом, между чем различие typeid и typeof в C++. Вот то, что я знаю:

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

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

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

main.cpp

#include   
#include   //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

143
задан abhi 30 May 2016 в 22:37
поделиться

4 ответа

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

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

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

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

.
177
ответ дан 23 November 2019 в 22:59
поделиться

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

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

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

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

44
ответ дан 23 November 2019 в 22:59
поделиться

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

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

Ничего не случилось. То, что вы видите, это строковое представление имени типа. Стандартный Си++ не заставляет компиляторы выдавать точное имя класса, только от исполнителя (производителя компилятора) зависит, что именно подходит. Короче говоря, имена зависят от компилятора.


Это два разных инструмента. 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.
}
20
ответ дан 23 November 2019 в 22:59
поделиться

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

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

.
26
ответ дан 23 November 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: