Здравствуйте, CEMb, Вы писали:
CEM>Принцип создания функции инициализации:
Если нормальный RAII, без двухфазной инициализации (или что там у тебя), с нормальными RAII полями, ну ни как не получается (почему?), то можно:
BOOL CApp::InitCommon()
{
return initialize(m_zero, m_one, m_two);
}
Где initialize это variadic шаблон функции, который прячет внутри всю эту логику.
Либо извратится через RAII обвёртки + ScopeGuard:
BOOL CApp::InitCommon()
{
try
{
auto a = init(m_zero);
auto b = init(m_one);
auto c = init(m_two);
// ...
commit(a, b, c);
}
catch(init_failure)
{
return false;
}
return true;
}
init возвращает ScopeGuard, который при отсутствии commit'а сделает uninit в деструкторе. А с использованием
stack_unwinding commit можно вообще убрать.
Либо просто goto:
BOOL CApp::InitCommon()
{
if(!m_zero.InitCommon())
goto ERROR_zero;
if(!m_one.InitCommon())
goto ERROR_one;
if(!m_two.InitCommon())
goto ERROR_two;
//...
return true;
ERROR_two:
m_two.UninitCommon();
ERROR_one:
m_one.UninitCommon();
ERROR_zero:
m_zero.UninitCommon();
return false;
}
Уж точно проще и лаконичней твоего варианта