gpt4 book ai didi

c++17 - StateMachine 与 std::variant,正确进行自定义模板推导

转载 作者:行者123 更新时间:2023-12-02 02:53:58 25 4
gpt4 key购买 nike

下面的代码如何正确编写自定义模板推导?

template<class R, class State, class... Ts> struct visitor : Ts... { using  Ts::operator()...; };
template<class R, class State, class... Ts> visitor(State, Ts...)->visitor<class R, State,Ts...>;

using Event = std::variant<HeartBeat, ConfigurationRead>;
using State = std::variant<Idle, Starting, Running, Error>;

void case3()
{
Event e;
State currentState;
State newState = std::visit( visitor{
[](Idle&& state, HeartBeat event) {std::cout << "Currently stopped, heartbeat received.\n"; return Error{}; }
}, currentState, e);
}

我查看了几个示例,但找不到使用 std::visit 返回的示例。

最佳答案

您的访问者不需要推导和编码返回类型 R - 将由 std::visit 本身推断:从可调用或固定到推导指定的模板参数(见下文)。话虽如此,它可以简化为:

template <typename... Ts> struct visitor : Ts... { using Ts::operator()...; };
template <typename... Ts> visitor(Ts...) -> visitor<Ts...>;

但是,每个访问者必须返回相同的类型。您可以通过例如为每个 lambda 表达式显式指定一个类型来避免任何类型不匹配:

State newState = std::visit( visitor{
[](Idle state, HeartBeat event) -> State { return Error{}; },
// ~~~~^
[](auto state, auto event) -> State { return state; }
// ~~~~^
}, currentState, e);

DEMO

<小时/>

,返回类型可以指定为 std::visit 的第一个模板参数:

State newState = std::visit<State>( visitor{
// ~~~~^
[](Idle state, HeartBeat event) { return Error{}; },
[](auto state, auto event) { return state; }
}, currentState, e);

关于c++17 - StateMachine 与 std::variant,正确进行自定义模板推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53462311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com