C++将类的静态方法存储在无序映射中
C++ storing static methods of classes in unordered_map
我有一个基类Vehicle
,我想用Runnable
的子类(Motorcycle
、Car
、Airplane
)填充std::unordered_map
,这样我就可以遍历映射并依次调用静态方法Motorcycle::run()
、Car::run()
、Airplane::run()
。
我应该如何填充std::unordered_map
?
有两种方法。
艰难的道路:
由于静态函数不是虚拟的,因此必须存储Mororcyle
、Car
和Airplane
中的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();
};
相关文章:
- 递归无序映射
- 正在将无序映射设置为无序映射的值
- 智能指针作为无序映射键,并通过引用进行比较
- 打印无序映射的第二个元素,即集合
- 由并发无序映射查找线程调用的函数是否安全?
- 将大数字(10-12 位数字)存储在无序映射中<字符串,整数>
- 使用无序映射在STL中存储键值对
- 为C++中的无序映射获取给定输入键的错误值
- 将大型对象存储在无序映射中是否效率低下
- 在无序映射的结构化绑定中推导类型
- 使用无序映射进行错误索引
- 将一个向量对放在一个无序映射与一个映射中
- 如何在c++中修改无序映射中的每个值
- C++:使用一对(cpp_int,int)整数作为无序映射中的键(其中cpp_int是boost多精度整数)
- 将 [] 索引到无序映射时出现段错误
- 以std::字符串作为关键字,按字典顺序对一个无序映射进行排序
- 无序映射存储桶的节点大小
- 在无序映射<字符串上使用 find(),向量<string>>与 C++ 中的有序映射花费相同的时间
- 以三个无符号字符为关键字的无序映射
- 无序映射比c++中的映射慢吗