Основная идея заключается в уменьшении количества , если ... еще ответвлений.Может быть, какой-то диспетчер, что-то вроде этого:
int ptr_pair_state(const obj1 *p1, const obj1 *p2)
{
return (p1 ? 1 : 0) | (p2 ? 2 : 0);
}
int Function(Object* obj1, Object* obj2)
{
std::map<int, std::function<void()>> disp{ { 0, f1 }, { 1, f2 }, { 2, f3 }, {3, f4 } };
int state = ptr_pair_state(obj1, obj2);
disp[state]();
}
, где f1 - f4 - некоторые функции, например
void f1()
{
std::cout << "f1";
}
Однако это может показатьсякак ненужное усложнение, так что еще одна простая альтернатива - использовать оператор переключателя:
int Function(Object* obj1, Object* obj2)
{
int v = (p1 ? 1 : 0) | (p2 ? 2 : 0);
switch(v)
{
case 0: // both nullptr
break;
case 1: // p1 not nullptr
break;
case 2: // p2 not nullptr
break;
case 3: // both not nullptr
break;
}
}
, который намного элегантнее бесконечного если ... еще если