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



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




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


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



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



главная.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
929   6  

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

Comments

    Ничего не найдено.