Могу ли я определить, равен ли объект std::type_info другому или классу, производному от этого другого?

#c #polymorphism #rtti #typeid

#c #полиморфизм #rtti #typeid

Вопрос:

У меня есть фабрика, в которой есть магазины, работающие с несвязанными вещами. Некоторые магазины работают на личных автомобилях и производных от них классах ( легковые автомобили, внедорожники, мопеды), а другие работают на военных транспортных средствах и производных от них классах (танки, самолеты, подводные лодки ).

Этот вопрос относится к моему заводскому классу, который не заботится о том, что производится в цехах, но он предоставляет некоторые услуги, позволяющие убедиться, что нужные типы транспортных средств направляются в нужные цеха. т. Е., если Audi A4 появляется на погрузочной площадке, его необходимо идентифицировать как личный автомобиль и направить в личный автосервис.

Могу ли я сделать это без объявления типов транспортных средств, возможных в классе Factory?

Итак, более подробно о специфике кодирования на C , я подумал, что на моем заводе мог бы быть std::map<shop *, const std::type_info *> контейнер, где std::type_info * был предоставлен магазинами, и указывает на базовый класс транспортного средства (например, личный автомобиль или военная машина). Но … мне не удалось найти способ проверить, совпадает ли объект std::type_info для объекта с кандидатом или производным от этого кандидата.

Если на Заводе были известны хотя бы базовые типы транспортных средств (персональный автомобиль и военный автомобиль), я знаю, как использовать dynamic_cast<>() действие с указателями personal auto или military vehicle для проверки равенства типов или того, что один из них является производным от базового. Тем не менее, я надеюсь сделать фабрику как можно более общей.

Есть идеи?

Ответ №1:

Почему бы не позволить магазинам указывать, кто они такие? Создайте интерфейс, который должен реализовать каждый магазин, с методами, основанными на правилах типа

 virtual bool CanBeShipped() const = 0;
virtual bool IsMilitary() const = 0;
  

таким образом, фабрика обладает только знаниями правил, которые ей необходимо реализовать.

Комментарии:

1. Для этого потребовалось бы, чтобы каждый магазин каким-то образом был осведомлен обо всех различных типах товаров, производимых всеми магазинами. т. Е. IsMilitary(), как вы предлагаете, требует, чтобы личный автосервис знал, что другие магазины производят военные товары.

Ответ №2:

На данный момент я полагаю, что нужный мне тип операции с объектами std::type_info невозможен.

Я думаю, что следующий лучший вариант — возложить ответственность за идентификацию на магазины. Магазины поддерживают таблицу конкретных произведенных продуктов и их идентификацию типа. например

 std::list<const std::type_info *> productsMadeHere;
  

Магазины также предоставляют общий интерфейс, который фабрика может использовать для опроса магазина, если он принимает определенный тип.

 Shop::isThisMadeHere(std::type_info * product_type );