在template中使用std::variant的template函数

Use of emplace function of std::variant in template

本文关键字:template variant 函数 std      更新时间:2023-10-16

我正在试验最终状态机和std::variant<gt;

std::variant将包含所有可能的状态。状态将在State类中定义。

我希望std::monostate作为第一种State变体,将其用作";"不改变状态";价值所以定义是:第一种类型是std::monstate,第二种类型是fsm的初始状态。

由于std::变量被初始化为它的第一个元素,我想使用template<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;

但这给出了compiletime错误:

..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>();
}

模板函数的使用是否有限制?

由于state依赖于模板名称,因此必须添加template:

state.template emplace<1>();

模板函数的使用有限制吗?

我不知道正式规则的措辞,但你需要在这里使用template关键字。clang给出了一个更具描述性的错误";依赖模板名称"template"之前缺少"template"关键字";。将state.emplace<1>();更改为state.template emplace<1>();将修复构建错误。

尽管就其价值而言,我也认为在成员初始值设定项中使用in_place_index_t(由Nicol Bolas在评论中建议(是一个更优雅的解决方案。