我可以判断一个std :: type_info对象是否等于另一个OR是从另一个派生的类吗?

时间:2011-04-13 04:27:59

标签: c++ polymorphism rtti typeid

我有一家工厂,有商店可以处理不相关的事情。一些商店的工作或个人汽车和从那里派生的课程(汽车,SUV,轻便摩托车)和其他工作军车和从那里派生的班级(坦克,飞机,潜水艇)。

这个问题与我的工厂类有关,它不关心商店里的产品,但确实提供了一些服务,以确保正确类型的车辆被送到正确的商店。即,如果奥迪A4出现在装卸码头,则需要将其识别为个人汽车并送往个人汽车店。

我可以在不声明Factory类中可能的车辆类型的情况下执行此操作吗?

所以,在更多的C ++编码细节中,我认为我的工厂可以有一个std::map<shop *, const std::type_info *>容器,其中std::type_info *由商店提供,并指向车辆的基类(例如,个人)汽车或军用车辆)。 但是......,我无法找到一种方法来检查一个对象的std::type_info是否与从该候选者派生的候选 OR 相同。

如果工厂知道至少基本车辆类型(个人汽车和军用车辆),我知道如何使用dynamic_cast<>()代理个人自动指针或军用车辆指针来检查类型相等或那个一个来自基地。但是,我希望尽可能让工厂变得一般。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

为什么不让商店告诉他们是谁? 使用基于

等规则的方法创建每个商店必须实现的界面
virtual bool CanBeShipped() const = 0;
virtual bool IsMilitary() const = 0;

这样工厂才能了解它需要实施的规则。

答案 1 :(得分:0)

此时我认为我想要的std :: type_info对象的操作类型是不可能的。

我认为下一个最好的选择是将识别责任推到商店。 商店保留了一份特定产品的表格及其类型标识。 e.g。

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

商店还提供了一个通用界面,如果工厂接受特定类型,工厂可以使用该界面进行轮询。

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