Есть много способов.Вы можете использовать препроцессор:
#define CALL(f, ...) do { \
f(OUTSIDE_BSPH, __VA_ARGS__); \
if (bsph) \
f(INSIDE_BSPH, __VA_ARGS__); \
} while(0)
CALL(f, arg1, arg2, arg3, arg4, arg5);
CALL(g, arg6, arg7, arg8);
CALL(h, arg3, arg4, arg5);
#undef CALL
Просто оставьте область, где ваш макрос определен небольшой, и проблем не должно быть.
Или вы можете использовать шаблоны и лямбды:
template <class F>
void call(bool bsph, F f) {
f(OUTSIDE_BSPH);
if (bsph)
f(INSIDE_BSPH);
}
call(bsph, [&](int x){ f(x, arg1, arg2, arg3, arg4, arg5); });
call(bsph, [&](int x){ g(x, arg6, arg7, arg8); });
call(bsph, [&](int x){ h(x, arg3, arg4, arg5); });
Если бы вы допустили хотя бы C ++ 14, я бы предпочел использовать универсальную лямбду, которая не слишком далека от простоты первого решения:
auto call = [&](auto f){
f(OUTSIDE_BSPH);
if (bsph)
f(INSIDE_BSPH);
};
call([&](int x){ f(x, arg1, arg2, arg3, arg4, arg5); });
call([&](int x){ g(x, arg6, arg7, arg8); });
call([&](int x){ h(x, arg3, arg4, arg5); });