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

Hosted by uCoz