класс typeid и type_info - PullRequest
       41

класс typeid и type_info

2 голосов
/ 12 февраля 2012
namespace std {
 class type_info
 {
 public:
  virtual ~type_info(); //type_info can serve as a base class
 // enable comparison
  bool operator==(const type_info& rhs ) const;
 // return !( *this == rhs)
  bool operator!=(const type_info& rhs ) const;
  bool before(const type_info& rhs ) const; // ordering
 //return a C-string containing the type's name
  const char* name() const;
 private:
  //objects of this type cannot be copied
     type_info(const type_info& rhs );
     type_info& operator=(const type_info& rhs);
 }; //type_info
}  

В объявлении класса type_info я не могу найти какой-либо элемент данных. Так что построено или разрушено ?? Кроме того, typeid не объявлен в нем. Так как объект type_info доступен к нему?
Является ли указанное выше представление неполным? Расскажите, пожалуйста, о типе члена данных в type_info классе

Ответы [ 3 ]

4 голосов
/ 12 февраля 2012

Похоже, вы смотрите на общедоступный интерфейс typeinfo из C ++ 03.Стандарт не ограничивает реализацию добавлением членов к стандартному классу (при условии, что имена приходят от тех, которые зарезервированы для реализации), чтобы заставить вещи работать.

В реализации, которую я сейчас использую std::typeinfo имеет закрытый член const char* __name, который используется для реализации открытых функций-членов в соответствии с требованиями стандарта.

ISO / IEC 14882: 2011 17.5.2.3 Закрытые члены [objects.within.classes] /1:

В пунктах 18–30 и Приложении D не указывается представление классов, а намеренно опускается спецификация членов класса (9.2).Реализация может определять статические или нестатические члены класса, или и то, и другое, как необходимо для реализации семантики функций-членов, указанных в разделах 18–30 и Приложении D.

Аналогичная формулировка появляется в C ++03 17.3.2.3.

4 голосов
/ 12 февраля 2012

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

typeinfo не нужно иметь никаких членов данных; его метод name позволяет обслуживать строки из того, что фактически является массивом static. Например, рассмотрим этот простой класс, который знает свое имя:

// foo.h
class Foo {
    // look ma, no data members!
  public:
    char const *name() const;
};

// foo.cpp
char const NAME[] = "Foo";
char const *Foo::name() const { return NAME; }

Помимо name основной операцией над typeinfo объектами является ==, которая может быть реализована простым сравнением указателей между объектами; в этом случае компилятор мог бы создать большой массив typeinfo [] где-нибудь приватно, а typeid просто индексировал бы в этот массив, чтобы получить правильный typeinfo объект. Как это работает, однако, зависит от реализации.

0 голосов
/ 12 февраля 2012

Нет данных, к которым вы можете получить доступ.type_info реализован для вас компилятором;детали не являются публичными.Вы получаете type_info, используя typeid.

Не волнуйтесь, задача компилятора - заставить все это работать.

...