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