eao197 on the Web
Сайт Евгения Охотникова
[ Главная | Проекты | Описания | Об авторе | Лицензия ]

C++ tricks: try_call_handler

Был код метода-диспетчера, который в зависимости от типа события вызывал обработчика события:

void
listen_thread_t::handle_event(
const mbapi_cln_2::event_t & evt )
  {
    // Защищаемся от исключений, которые могут произойти
    // при приведении типов.
    try
      {
        // Определяем, какое же событие мы получили.
        if( mbapi_cln_2::wms_comm_ctl_1::login_result_t::event_id == evt.query_event_id() )
          on_login_result( dynamic_cast<
            const mbapi_cln_2::wms_comm_ctl_1::login_result_t & >( evt ) );
        else if( mbapi_cln_2::wms_comm_ctl_1::action_list_event_t::event_id == evt.query_event_id() )
          on_action_list_event( dynamic_cast<
            const mbapi_cln_2::wms_comm_ctl_1::action_list_event_t & >( evt ) );
        else if( mbapi_cln_2::wms_comm_ctl_1::action_full_event_t::event_id == evt.query_event_id() )
          on_action_full_event( dynamic_cast<
            const mbapi_cln_2::wms_comm_ctl_1::action_full_event_t & >( evt ) );
        else if( mbapi_cln_2::wms_comm_ctl_1::customer_list_event_t::event_id == evt.query_event_id() )
          on_customer_list_event( dynamic_cast<
            const mbapi_cln_2::wms_comm_ctl_1::customer_list_event_t & >( evt ) );
        else if( mbapi_cln_2::wms_comm_ctl_1::customer_full_event_t::event_id == evt.query_event_id() )
          on_customer_full_event( dynamic_cast<
            const mbapi_cln_2::wms_comm_ctl_1::customer_full_event_t & >( evt ) );
      }
    catch( ... )
      { ... }
  }

И стало мне как-то грусно добавлять новые вызовы. Особенно когда потребовалось заделать обработчик события mbapi_cln_2::wms_comm_ctl_1::action_update_result_event_t. Пораскинул я так это мозгами (широко, надо сказать, пораскинул)... И вот чего наваял:

//! Шаблон, который сильно облегчает жизнь при вызове
//! обработчиков MBAPI-событий.
template<
  class Owner_class,
  class Event_class,
  class Event_base >
inline bool
try_call_handler(
  Owner_class & owner,
  void (Owner_class::* handler)( const Event_class * ),
  const Event_base * event )
  {
    if( Event_class::event_id == event->query_event_id() )
      {
        (owner.*handler)( dynamic_cast< const Event_class * >( event ) );
        return true;
      }

    return false;
  }

void
listen_thread_t::handle_event(
const mbapi_cln_2::event_t * evt )
  {
    // Защищаемся от исключений, которые могут произойти
    // при приведении типов.
    try
      {
        // Определяем, какое же событие мы получили.
        if( try_call_handler( *this, &listen_thread_t::on_login_result, evt ) )
          {}
        else if( try_call_handler( *this, &listen_thread_t::on_action_list_event, evt ) )
          {}
        else if( try_call_handler( *this, &listen_thread_t::on_action_full_event, evt ) )
          {}
        else if( try_call_handler( *this, &listen_thread_t::on_customer_list_event, evt ) )
          {}
        else if( try_call_handler( *this, &listen_thread_t::on_customer_full_event, evt ) )
          {}
        else if( try_call_handler( *this, &listen_thread_t::on_action_update_result_event, evt ) )
          {}
      }
    catch( ... )
      {...}
  }

void
listen_thread_t::on_login_result(
  const mbapi_cln_2::wms_comm_ctl_1::login_result_t * result )
  {...}

void
listen_thread_t::on_action_list_event(
  const mbapi_cln_2::wms_comm_ctl_1::action_list_event_t * list )
  {...}

void
listen_thread_t::on_action_full_event(
  const mbapi_cln_2::wms_comm_ctl_1::action_full_event_t * action )
  {...}

void
listen_thread_t::on_customer_list_event(
  const mbapi_cln_2::wms_comm_ctl_1::customer_list_event_t * list )
  {...}

void
listen_thread_t::on_customer_full_event(
  const mbapi_cln_2::wms_comm_ctl_1::customer_full_event_t * customer )
  {...}

void
listen_thread_t::on_action_update_result_event(
  const mbapi_cln_2::wms_comm_ctl_1::action_update_result_event_t * result )
  {...}

© 2003-2005 Е.А. Охотников
$LastChangedDate: 2005-04-29 08:42:34 +0400 (Пт, 29 апр 2005) $
e-mail

Hosted by uCoz