C ++ Как отличить определенные типы объектов от гетерогенной коллекции?

Так что, если у меня есть разнородная коллекция объектов автомобилей

Автомобиль * c = {грузовик, фургон, кабриолет}

Если коллекция объектов была случайной, и я хотел просмотреть коллекцию с помощью цикла for, как я могу проверить определенный тип объекта?

0

Решение

Вы бы использовали dynamic_cast:

if (truck* truck_p = dynamic_cast<truck*>(car_p)) {
// car_p points at a truck
}

dynamic_cast проверит динамический тип объекта, на который указывает car_p и разрешить приведение, только если это truck, Если это не truck, это даст нулевое значение указателя и, следовательно, if условие не выполнится.

Однако необходимость тестирования такого динамического типа предполагает плохой дизайн кода. Смысл полиморфизма в том, что вы можете обрабатывать любой из производных объектов так, как если бы он был базовым — не нужно проверять, какой именно это был производный тип. Если вам нужно проверить динамический тип Car так что вы можете сделать некоторые truck-специфическая операция на нем, то вы не должны бросать это truck в контейнер Car*,

6

Другие решения

Если вам нужно знать производный тип, тогда полиморфизм не является подходящим инструментом для работы. Я бы предложил использовать повышение :: вариант или эквивалент для реализации шаблон посетителя.

2

Попробуйте посмотреть на RTTI:

http://en.wikipedia.org/wiki/Run-time_type_information

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

1
По вопросам рекламы [email protected]