C ++在unordered_map中存储类的静态方法

时间:2014-09-29 20:48:18

标签: c++ static-methods

我有一个基类Vehicle,我希望填充一个std::unordered_map,其子类为RunnableMotorcycleCarAirplane )这样我就可以遍历地图并连续调用静态方法Motorcycle::run()Car::run()Airplane::run()

我应该如何填充std::unordered_map

2 个答案:

答案 0 :(得分:1)

有两种方法。

艰难的方式:

由于静态函数不是虚拟的,因此您必须存储Mororcyle CarAirplanetypedef boost::variant< Motorcycle, Car, Airplane > VRunnable; // variant unordered_map<key_t, VRunnable> m;

unorderd_map

当您遍历Runnable时,您可以识别对象的类型,并调用正确类型的静态成员。您可以通过使用一个访问者类来执行此操作,该访问者类定义了变量中覆盖类型的操作。

它有效,但考虑到你想做什么,这是非常乏味的。实际上,这里没有利用unordered_map<key_t, Runnable> m; for (auto x: m) f.second.vrun(); 继承和多态的任何优势。

聪明的方式:

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

{{1}}

答案 1 :(得分:0)

在C ++中,您无法多态调用静态方法。但是,您可以调用常规方法并使 it 调用静态方法。

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

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