【发布时间】:2020-07-09 15:10:32
【问题描述】:
我正在尝试使用有限状态机和 std::variant<..>
std::variant 将保存所有可能的状态。状态将在 State 类中定义。
我希望将 std::monostate 作为第一种类型的 State 变体,以将其用作“不更改状态”值。 所以定义是:第一种是std::monostate,第二种是fsm的初始状态。
由于 std::variant 被初始化为它的第一个元素,我想在构造函数中使用 emplace。
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函数有使用限制吗?
【问题讨论】:
-
"由于 std::variant 被初始化为它的第一个元素,我想在构造函数中使用 emplace。" 你为什么不这样做成员初始化列表,带有the
in_place_index_tconstructor ofvariant?
标签: c++ templates c++17 emplace std-variant