2014-09-29 89 views
1

类静态方法我有一个基类Vehicle和欲填充的Runnable亚类(MotorcycleCarAirplane),使得我可以通过在地图上进行迭代,并调用静态方法Motorcycle::run()Car::run()一个std::unordered_mapAirplane::run()。如何填充std::unordered_mapC++存储在unordered_map

+0

你在做这个而不是使用多态性的原因是什么?可能有一个更容易/更好的方式来做你想做的事情。 – Velox 2014-09-29 20:52:44

+0

是的,指定你想要做什么可能确实有助于找到更好的解决方案。 – Svalorzen 2014-09-29 20:54:08

+0

从给出的信息几乎可以保证有一个设计问题,一方面你有一个类的实例,另一方面你有静态函数,你希望能够调用,从而放弃对象关系。 – Ylisar 2014-09-29 20:55:54

回答

1

有两种方法。

难的方法:

静态函数不是虚拟的,你必须存储的MororcyleCarAirplaneboost::variant

typedef boost::variant< Motorcycle, Car, Airplane > VRunnable; // variant 
unordered_map<key_t, VRunnable> m; 

当你遍历你unorderd_map,你便可以识别物体的类型,并调用正确类型的静态成员。您可以通过使用访问者类来完成此操作,该类定义了变体中操作超载的操作类型。

它可以工作,但考虑到你想要做什么,它更加繁琐。实际上,在这里你并没有采用Runnable继承和多态。

聪明的办法:

更简单的方法是将有一个虚拟成员的Runnable :: V运行()调用每一个Runnable的子类的approporiate静态的run()。然后,您可以简单地遍历您的无序映射,然后调用虚函数:然后该对象将调用正确的静态成员。

unordered_map<key_t, Runnable> m; 
for (auto x: m) 
    f.second.vrun(); 
0

在C++中,不能多态地调用静态方法。但是,您可以调用常规方法并调用静态方法

struct Runnable 
{ 
    virtual void run_me() = 0; 
}; 

class Car : public Runnable 
{ 
public: 
    virtual void run_me() { run(); } 
    static void run(); 
};