C ++ Boost SML Library - PullRequest
       15

C ++ Boost SML Library

0 голосов
/ 04 мая 2018

Я пытаюсь понять библиотеку, и меня смущает, что такое высокоуровневая идея определенных типов событий. Я читал руководство по обучению здесь: Повышение экспериментальной документации. . Часто используются такие типы, как on_exit, on_entry и _, которые я не понимаю.

struct _ {}; // I don't understand how to use this

template <class T, class TEvent = T>
struct on_entry : internal_event, entry_exit { // A setup function that runs before the actual event
    // ...

template <class T, class TEvent = T>
struct on_exit : internal_event, entry_exit { // Will run after the event has completed.
    // ...

struct anonymous : internal_event { // Not sure, I think this is for any unknown type that you have not defined.

Моя конечная цель состоит в том, чтобы я хотел иметь общий обработчик событий. Src_state может иметь специальный обработчик для E1, но для E2, E3 и т. Д. Я хочу, чтобы был общий обработчик. У меня есть код ниже, чтобы перечислить, что я хочу, но, очевидно, это не работает.

#include <boost/sml.hpp>
#include <cassert>
#include <iostream>

namespace sml = boost::sml;

namespace {
struct e1 {};
struct e2 {};
struct e3 {};
struct e4 {};

struct transitions {
    auto operator()() const noexcept {
    using namespace sml;
    return make_transition_table(
        *"idle"_s                  / [] { std::cout << "anonymous transition" << std::endl; } = "s1"_s
        , "s1"_s + event<e1>        / [] { std::cout << "internal s1 transition" << std::endl; }
        , "s1"_s + event<e2>        / [] { std::cout << "self transition" << std::endl; } = "s2"_s
        , "s1"_s + event<_>         / [] { std::cout << "s1 Handle all other events here" << std::endl; } = "s1"_s
        , "s2"_s + event<e2>        / [] {std::cout << "internal s2 transition" << std::endl; }
        , "s2"_s + event<_>         / [] { std::cout << "s2 Handle all other events here" << std::endl; } = "s2"_s
        , "s2"_s + event<e3>        / [] { std::cout << "external transition" << std::endl; } = X
);
    }
};
}

int main() {
    sml::sm<transitions> sm;
    sm.process_event(e1{}); // Basic
    sm.process_event(e3{}); // The underscore should handle the event now...
    sm.process_event(e2{}); // Transition to s2
    sm.process_event(e1{}); // The _ should handle this.
    sm.process_event(e4{}); // The _ should handle this.
    sm.process_event(e3{}); // X

    assert(sm.is(sml::X));
}

Возможно ли даже иметь общий обработчик событий для ВСЕХ событий, включая ожидаемые и неожиданные события. Конечный автомат ожидает, что e1 / e2 / e3 / e4 будут происходить время от времени.

...