eao197 on the Web Сайт Евгения Охотникова |
[ Главная | Проекты | Описания | Об авторе | Лицензия ] |
C++ tricks: assign
Столкнулся я с одной задачкой: есть два объекта (a,b) одного типа ssl_params_t. Нужно проверить ряд полей объекта a и, если какое-то поле пустое, то присвоить ему значение такого же поля из b. В данном случае поля строковые, но это не суть.
Простое решение могло бы выглядеть так:
if( a.m_cln_cert_file.empty() ) a.m_cln_cert_file = b.m_cln_cert_file; if( a.m_cln_privkey_file.empty() ) a.m_cln_privkey_file = b.m_cln_privkey_file; ...
Что неудобно и черевато ошибками.
Можно было бы еще подумать и получить:
void assign( std::string & to, const std::string & what ) { if( to.empty() ) to = what; } ... assign( a.m_cln_cert_file, b.m_cln_cert_file ); assign( a.m_cln_privkey_file, b.m_cln_privkey_file ); ...
Но это решение так же черевато ошибками. Можно сделать еще надежнее:
void assign( ssl_params_t & to, ssl_params_t & from, std::string (ssl_params_t::*field) ) { std::string & what = to.*field; if( what.empty() ) what = from.*field; } ... assign( a, b, &ssl_params_t::m_cln_cert_file ); assign( a, b, &ssl_params_t::m_cln_privkey_file ); ...
При необходимости такую вспомогательную функцию assign можно докрутить до шаблона.
© 2003-2005 Е.А. Охотников
$LastChangedDate: 2005-04-29 08:42:34 +0400 (Пт, 29 апр 2005) $