вторник, 17 июня 2014 г.

[prog.c++] Упрощение создания агентов в SObjectizer?

Если уж идти по пути использования C++ных lambda-функций в SObjectizer на полную катушку, то почему бы не разрешить объявлять в качестве агента лямбду? Без необходимости писать класс агента, писать для него конструктор, переопределять виртуальные методы и пр.

В текущем варианте новой версии 5.3 в примере синхронного взаимодействия агентов parallel_sum есть один агентик, который сейчас определяется вот так:

class a_part_summator_t : public so_5::rt::agent_t
   {
   public :
      a_part_summator_t(
         so_5::rt::so_environment_t & env,
         const so_5::rt::mbox_ref_t & self_mbox )
         :  so_5::rt::agent_t( env )
         ,  m_self_mbox( self_mbox )
         {}

      virtual void
      so_define_agent()
         {
            so_subscribe( m_self_mbox ).event(
                  []( const msg_sum_part & part ) {
                     return std::accumulate( part.m_begin, part.m_end, 0 );
                  } );
         }

   private :
      const so_5::rt::mbox_ref_t m_self_mbox;
   };

Хотя можно было бы свести его вот к такому:

coop->define_agent( mbox,
    []( const msg_sum_part & part ) {
      return std::accumulate( part.m_begin, part.m_end, 0 );
    } );

Первые выглядящие действительно реальными наметки зафиксировал вот здесь. Если кому-то интересно, то подключайтесь к обсуждению.

Отправить комментарий