C++将类的静态方法存储在无序映射中

C++ storing static methods of classes in unordered_map

本文关键字:无序 映射 存储 静态方法 C++      更新时间:2023-10-16

我有一个基类Vehicle,我想用Runnable的子类(MotorcycleCarAirplane)填充std::unordered_map,这样我就可以遍历映射并依次调用静态方法Motorcycle::run()Car::run()Airplane::run()

我应该如何填充std::unordered_map

有两种方法。

艰难的道路:

由于静态函数不是虚拟的,因此必须存储MororcyleCarAirplane中的boost::variant

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

当您遍历unorderd_map时,您可以识别对象的类型,并调用正确类型的静态成员。您可以通过使用一个访问者类来实现这一点,该类定义了变体中重载的fo reach类型的操作。

它是有效的,但考虑到你想做什么,它就不那么乏味了。事实上,你在这里没有利用Runnable继承和多态性的任何优势。

智能方式:

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

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

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

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