Вы можете попытаться сделать это функцией-шаблоном, который принимает произвольный предикат. Если предикат прост, как в ваших случаях, вы, вероятно, можете положиться на компилятор, чтобы встроить его, чтобы не было потери эффективности. Вы должны профилировать свою заявку, чтобы убедиться в этом. Код может выглядеть так:
template<class Pred>
void f(int a[], Pred pred) {
///CODE
for
for
if(pred(a[i]))
//change i on some condition
for
//CODE
if(pred(a[i]))
///CODE
}
До C ++ 11 вам приходилось передавать функторы или указатели функций в качестве предикатов, в C ++ 11 вы могли бы использовать лямбда-выражения:
f(data, [](int val){ return val > 0; });
f(data, [th](int val){ return val < th; });