【发布时间】:2016-11-27 14:49:04
【问题描述】:
我有需要对其进行操作的设备。我有一个基类BASE 和一个子类TYPE1。
每个设备都是TYPE1 的一个实例。这些由另一个类实例化,具体取决于 xml 配置文件中存在的内容。
class BASE {
public:
BASE();
virtual ~BASE();
};
class TYPE1 : public BASE {
public:
TYPE1();
};
现在我将指向这些实例的指针存储在 std::unordered_map 中,定义为:
std::unordered_map <std::string, TYPE1 *> myDevices;
std::string 是一个标识密钥,也用于配置文件。
std::unordered_map 让我可以在需要时快速直接访问对象,如果我使用
for ( auto& elem : myDevices ) {
//do stuff
}
设备的顺序并不重要,因此std::unordered_map。
我在整个代码中广泛使用它。
现在我需要一个 TYPE2,它也是 BASE 的子代,但类型不同。
TYPE1 和 TYPE2 都实现了相同的方法 - 它们的功能不同 - 但产生相同的结果
我的问题:
如何修改
std::unordered_map <std::string, TYPE1 *> myDevices;
所以它接受所有类型的类,如
std::unordered_map <std::string, acceptAnyTypeOfClass *> myDevices;
我对此感到困惑,虽然我认为我可以绕过它,但它会很快变得丑陋,我真的很想以一种干净的方式来做。我要问的可能吗?如果可以,请问怎么做?
【问题讨论】:
-
std::unordered_map <std::string, BASE *>? -
使用
std::unordered_map<std::string, std::unique_ptr<BASE>>。 -
@Arch 在正确的轨道上。
-
别担心。这个网站越来越糟糕,完全合理的问题因虚假原因而被否决。
-
@ZoOl007
acceptAnyTypeOfClass适用于 c++17 标准的std::any,否则您可以回退到boost::any。
标签: c++ pointers polymorphism unordered-map