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