Мой вопрос больше архитектурный вопрос. У меня есть несколько государственных машин одного типа. Сказать
controller_type1_sm controller1;
controller_type2_sm controller2;
std::array<worker1_sm,10> workers1;
std::array<worker2_sm,10> workers2;
Теперь, когда один контроллер отправляет сообщения, я должен использовать диспетчер, который отправляет имя или идентификатор в очередь, которая обрабатывается потоком, который вызывает process_event()
на указанном мсм?
События могут храниться в общей очереди, когда они получены из общей базы, но process_event()
нужно знать, что это за событие. Посетитель класса, чтобы отправить их? Есть лучшее решение?
Когда я ограничиваю события только числовыми идентификаторами, я могу устранить множество проблем, но с другой стороны, МСМ нужны типы, а не идентификаторы.
Нити, которые вызывают process_event()
Необходимо знать тип конечного автомата, на котором они работают. Шаблон очевидно …
РЕДАКТИРОВАТЬ:
Цель состоит в том, чтобы отделить реализации.
Фактически, это сводилось к тому, как поставить в очередь различные сообщения в очереди и вернуть их обратно без посетителя, который знает все события.
#include <queue>
#include <iostream>
struct runtime
{
template <class T>
void accept(const T& evt)
{
std::cout << "Accept: " << typeid(evt).name() << std::endl;
// fsm.process_evt(evt);
}
};
struct action
{
virtual void operator()(runtime& rt) = 0;
};
template <class T>
struct carrier : action
{
virtual void operator()(runtime& rt)
{
rt.accept(T());
}
};
struct ev_test {};
int main(int argc, char** argv)
{
using queue_t = std::deque<action*>;
queue_t q;
// capsulue the two functions
runtime rt;
carrier<int> f1;
carrier<ev_test> f2;
q.push_back(&f1);
q.push_back(&f2);
while (q.size())
{
auto& c = q.front();
(*c)(rt);
q.pop_front();
}
}
В этом примере «время выполнения» содержит мой FSM.