Этот вопрос действительно основан на мнениях, поэтому существует множество возможных решений, которые - в зависимости от индивидуальных предпочтений - могут быть выбраны.
Вы всегда можете проверить одну переменную в if
, а затем использовать троичный оператор
if (!a)
result = (!b) ? functionOne() : functionTwo();
else
result = (!b) ? functionThree() : functionFour();
Это имеет (возможное) преимущество, заключающееся в необходимости оценивать каждый из !a
и !b
ровно один раз во время выполнения.
Если вы хотите устранить отрицания (некоторые могут посчитать, что это лучше для читабельности, особенно из-за того, что имена функций нередко подразумевают их упорядочение), код можно превратить в
if (a)
result = b ? functionFour() : functionThree();
else
result = b ? functionTwo() : functionOne();
, что приводит нас к возможностям исключения оператор if
полностью.
// with negation
result = !a ? ((!b) ? functionOne() : functionTwo()) :
((!b) ? functionThree() : functionFour());
// without negation
result = a ? (b ? functionFour() : functionThree()) :
(b ? functionTwo() : functionOne());
Другой вариант, который приходит на ум, будет
int index = 2*a + b;
if (index == 0)
result = functionOne();
else if (index == 1)
result = functionTwo();
else if (index == 2)
result = functionThree();
else if (index == 3)
result = functionFour();
, который можно упростить, используя одномерный массив
using func = bool(*)(); // C++11 and later. typedef bool (*func)() for all C++ standards
func table[] = {functionOne, functionTwo, functionThree, functionFour};
result = table[2*a + b]();