我正在尝试使用最终状态机和 std::variant<..>
std::variant 将保存所有可能的状态状态将在 State 类中定义。
我想将 std::monostate 作为第一种状态变体,以将其用作“不更改状态”值。所以定义是:第一种是std::monostate,第二种是fsm的初始状态。
由于 std::variant 被初始化为它的第一个元素,我想在构造函数中使用 emplace<1> 。
template <typename StateVariant>
class fsm
{
public:
StateVariant state;
fsm()
{
state.emplace<1>();
};
};
struct Initial{};
struct Running{};
using State = std::variant<std::monostate,Initial,Running>;
fsm<State> myFSM;
但这会产生编译时错误:
..\fsm_emplace.cpp: In constructor 'fsm<StateVariant>::fsm()':
..\fsm_emplace.cpp:15:20: error: expected primary-expression before ')' token
15 | state.emplace<1>();};
但是,当我在非模板代码中使用相同的构造时:
State myState;
void setup()
{
myState.emplace<1>();
}
emplace 功能是否有使用限制?