Полезно иногда поспорить до хрипоты, защищая свою разработку :) Поневоле начинаешь смотреть на нее чужими глазами. И те вещи, которые раньше тебя устраивали вдруг оказываются... не очень удачными :)
Вот и сегодня посидел над примером и понял, что код подписки агентов, который был, вроде как, вполне себе нормальным, стал раздражать многословностью. Покурил, вроде бы чутка уменьшил количество буковок. Слева старый код, справа новый:
virtual void so_define_agent() override { so_change_state( st_free ); so_subscribe( so_direct_mbox() ).in( st_free ) .event( [this]( const msg_take & evt ) { so_change_state( st_taken ); evt.m_who->deliver_signal< msg_taken >(); } ); so_subscribe( so_direct_mbox() ).in( st_taken ) .event( []( const msg_take & evt ) { evt.m_who->deliver_signal< msg_busy >(); } ) .event( so_5::signal< msg_put >, [this]() { so_change_state( st_free ); } ); } |
virtual void so_define_agent() override { st_free.activate(); st_free.handle( [this]( const msg_take & evt ) { st_taken.activate(); so_5::send< msg_taken >( evt.m_who ); } ); st_taken.handle( []( const msg_take & evt ) { so_5::send< msg_busy >( evt.m_who ); } ) .handle< msg_put >( [this]() { st_free.activate(); } ); } |
Теперь проблема в том, что знаний C++11 и понимания variadic templates не хватает для того, чтобы реализовать различия между методами handle. Мне нужно как-то отличить handle(evt...) от handle(mbox, evt...). Что-то не догоняю :(
Если так и не догоню, то для подписки на сообщения из явно заданного mbox-а нужно будет делать либо st_free.handle_from(mbox, evt...), либо st_free[mbox].handle(evt...).
Upd. Разобрался. Теперь различаются handle(evt...) и handle(mbox, evt...).
Комментариев нет:
Отправить комментарий