【发布时间】:2021-09-15 07:45:41
【问题描述】:
我正在使用 boost:msm 创建状态机。似乎在处理事件时,状态机并不关心多态性。
假设我有多个事件都源自一个基本事件:
struct EvtBase { virtual ~EvtBase();}
struct EvtA : EvtBase {};
struct EvtB : EvtBase {};
如果我通过基本事件类型的指针将一堆事件存储在向量中:
typedef std::shared_ptr<EvtBase> ptrEvt;
std::vector<ptrEvt> event_list {std::make_shared<EvtA>(), std::make_shared<EvtB>()};
当我通过状态机处理这些事件时:
for (const auto& pEvt: event_list) {
fsm.process_event(*pEvt);
}
boost::msm 状态机认为它接收到EvtBase,而不是指针指向的实际事件。
我做错了什么,还是有办法改变这种行为并使process_event尊重多态性?
【问题讨论】:
-
运行时多态性和编译时不能很好地混合在一起。我认为你应该考虑 std::variant
-
@AlessandroTeruzzi 好建议,但不幸的是我不能使用 c++17。
-
你可以使用 boost::variant 来代替
-
@AlessandroTeruzzi 好电话,确实有效。