Я пытаюсь понять библиотеку, и меня смущает, что такое высокоуровневая идея определенных типов событий. Я читал руководство по обучению здесь: Повышение экспериментальной документации. . Часто используются такие типы, как 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 будут происходить время от времени.