'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
6 ответов:
язык C++ не имеет такого понятия, как
typeof. Вы должны смотреть на какое-то расширение для конкретного компилятора. Если вы говорите о GCCtypeof, то аналогичная функция присутствует в 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