вторник, 7 октября 2014 г.

[prog.c++] Попробовал уменьшить многословность SO-5.5

Полезно иногда поспорить до хрипоты, защищая свою разработку :) Поневоле начинаешь смотреть на нее чужими глазами. И те вещи, которые раньше тебя устраивали вдруг оказываются... не очень удачными :)

Вот и сегодня посидел над примером и понял, что код подписки агентов, который был, вроде как, вполне себе нормальным, стал раздражать многословностью. Покурил, вроде бы чутка уменьшил количество буковок. Слева старый код, справа новый:

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...).

Комментариев нет: