Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_otvety_k_ekzamenu.doc
Скачиваний:
55
Добавлен:
13.04.2015
Размер:
786.94 Кб
Скачать

39. Механизм rtti - назначение, особенности применения. Структура std::type_info, оператор typeid для выражений и типов.

RTTI механизм С++, предназначенный для определения типов во время выполнения программ. Его прямое применение носит довольно узко специализированный характер, однако на его основе функционируют такие важные механизмы языка, как оператор dynamic_cast и обработка исключений

Собственно, информация о типах, доступная программам для обработки, заключена в рамки структуры std::type_info из стандартной библиотеки, определение которой становится доступным после включения заголовочного файла <typeinfo>. Такая структура создается компилятором для всех использованных в программе типов данных. Сама структура довольно проста и содержит следующие открытые методы, доступные для программной обработки:

● Метод name(), возвращающий строку, представляющую название типа. Формат названия стандартом языка никак не определяется, и зависит от используемой среды разработки. Для простых случаев это название обычно соответствует названию типа в коде.

● Перегруженные операторы сравнения на равенство == и неравенство !=. Позволяют сравнивать два объекта type_info между собой для сопоставления. Реализация не гарантирует, что в программе для одного и того же типа будет существовать ровно 1 объект type_info, соответственно сравнивать два объекта type_info по адресу не является корректным, следует пользоваться именно операторами сравнения.

● Метод before, принимающий ссылку на другой объект std::type_info, и возвращающий bool, если первый тип условно “раньше” второго по порядку. Конкретный критерий для сравнения типов стандартом языка не оговаривается, реализация в праве использовать любой однозначный критерий. Этот метод можно использовать для сортировки объектов-типов, а также для помещения указателья на объект std::type_info в качестве ключа в контейнеры на основе бинарных деревьев (std::map, std::set).

● Объекты такой структуры копировать нельзя, реализация должна запрещать конструктор копий и оператор присвоения.

Получить такую структуру можно для любого типа при помощи оператора typeid:

#include "date.hpp"

#include <iostream>

#include <string>

#include <typeinfo>

int main ()

{

const std::type_info & intTypeInfo = typeid( int );

std::cout << intTypeInfo.name() << std::endl;

const std::type_info & dateTypeInfo = typeid( Date );

std::cout << dateTypeInfo.name() << std::endl;

const std::type_info & stringTypeInfo = typeid( std::string );

std::cout << stringTypeInfo.name() << std::endl;

}

Также, оператор typeid можно применить к любому выражению :

#include "date.hpp"

#include <iostream>

#include <string>

#include <typeinfo>

int main ()

{

const std::type_info & typeInfo1 = typeid( 2 + 5.3 );

std::cout << typeInfo1.name() << std::endl;

const std::type_info & typeInfo2 = typeid( Date().GetMonth() );

std::cout << typeInfo2.name() << std::endl;

const std::type_info & typeInfo3 = typeid( & std::string::substr );

std::cout << typeInfo3.name() << std::endl;

}

Существует два основных способа работы оператора typeid:

● статический - подстановка во время компиляции по указанному типу / выражению;

● полиморфный - подстановка во время выполнения на основе информации о фактическом типе, даже если объект скрывается за указателем или ссылкой на базовый класс.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]