Могу ли я сказать, равен ли объект std :: type_info другому ИЛИ классу, производному от этого другого? - PullRequest
1 голос
/ 13 апреля 2011

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

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

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

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

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

Есть идеи?

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

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

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

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

0 голосов
/ 18 ноября 2011

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

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

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

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

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