Повторные вызовы функций с одним аргументом, изменяющимся в C ++ - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть повторяющийся шаблон в моем коде

enum { OUTSIDE_BSPH = 0, INSIDE_BSPH = 1 };
bool bsph = true;
//...
bsph = false;

f(OUTSIDE_BSPH, arg1, arg2, arg3, arg4, arg5);
if (bsph) {
  f(INSIDE_BSPH, arg1, arg2, arg3, arg4, arg5);
}

g(OUTSIDE_BSPH, arg6, arg7, arg8);
if (bsph) {
  g(INSIDE_BSPH, arg6, arg7, arg8);
}

h(OUTSIDE_BSPH, arg3, arg4, arg5);
if (bsph) {
  h(INSIDE_BSPH, arg3, arg4, arg5);
}
// ...

, который я хотел бы упростить.Может ли оно быть преобразовано во что-то вроде

caller(bsph, f, arg1, arg2, arg3, arg4, arg5);

caller(bsph, g, arg6, arg7, arg8);

caller(bsph, h, arg3, arg4, arg5);

// ...

без использования указателей?

1 Ответ

0 голосов
/ 30 ноября 2018

Есть много способов.Вы можете использовать препроцессор:

#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); });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...