我正在尝试使用最终状态机和 std::variant<..>
std::variant 将保存所有可能的状态状态将在 State 类中定义。
我想要的是有一个 BaseState 类,应该在其中处理“通用事件”。使用派生的 State 类处理特定的状态。
struct LightOn;
struct LightOff;
struct Toggle;
struct Reset;
using State = std::variant<LightOn,LightOff>;
using Event = std::variant<Toggle,Reset>;
struct BaseState
{
void on_enter(){Serial.printf("BaseState enter\r\n");};
void on_event (const Reset &r);
};
struct LightOn : BaseState
{
LightOn(){Serial.printf("LightOn constructor\r\n");};
void on_event(const Event &e);
void on_exit(){Serial.printf("LightOn exit\r\n");}
void on_enter(){Serial.printf("LightOn enter\r\n");}
};
struct LightOff : BaseState
{
LightOff(){Serial.printf("LightOff constructor\r\n");};
void on_event(const Event &e);
void on_exit(){Serial.printf("LightOff exit\r\n");}
};
struct Toggle
{
Toggle(){Serial.printf("Struct Toggle\r\n");};
};
struct Reset
{
Reset(){Serial.printf("Struct Reset\r\n");};
};
void LightOn::on_event(const Event &e){Serial.printf("LightOn event\r\n");};
void LightOff::on_event(const Event &e){Serial.printf("LightOff event\r\n");};
void BaseState::on_event(const Reset &r){Serial.printf("BaseState reset\r\n");};
我的问题在于on_event
功能。
Basestate中的 Reset 有一个特定的,void on_event(const Reset &r);
而 LightOn 和 LightOff 中有一个更通用的void on_event(const Event &e);
(使用 Event = std::variant<Toggle,Reset>;)
但是当我这样做时
LightOn n;
n.on_event(Reset{});
来自 LightOn 的 on_event 被调用,而不是来自 BaseState 的那个。
有没有办法实现:当 BaseState 函数可用于此特定事件时调用 BaseState 函数?