Предотвращение дублирования кода: 2 длинные функции, отличающиеся только внутренним циклом

У меня есть две функции, f_a и f_b в общем виде,

void f_x(){
for (int i = 0; i < 10; ++ i){
for (int j = 0; j < 10; ++ j){
//do loads of generic stuff
//do stuff specific to x
}
}
};

Я не хочу ни (1) записывать циклы for более одного раза, либо (2) иметь условие для проверки во внутреннем цикле, чтобы определить, выполнять ли a- или b-специфику. Одним из решений является использование шаблонов следующим образом:

template <int I>
inline void specific(){}

template <>
inline void specific<0> { // do a-specific tasks }

template <>
inline void specific<1> { // do b-specific tasks }

template <int I>
void f(){
for (int i = 0; i < 10; ++ i){
for (int j = 0; j < 10; ++j){
//do loads of generic stuff
specific<I>();
}
}
}

inline void f_a(){
f<0>();
}

inline void f_b(){
f<1>();
}

Мои вопросы:

Похоже ли это на справедливое решение?

Из интереса, есть ли решение, которое не использует шаблоны?

0

Решение

Вместо того, чтобы иметь specific функции являются шаблонами, просто позвольте им быть обычными функциями и передайте их в ваш общий f функция.

Что-то вроде

template<typename F>
void f(F func){
for (int i = 0; i < 10; ++ i){
for (int j = 0; j < 10; ++j){
// Generic stuff...

// Call the specific function
func();
}
}
}

void specific_x() { ... }
void specific_y() { ... }

void f_x(){
f(specific_x);
}

void f_y(){
f(specific_y);
}

Похож на ваше решение, но более общий, как вы можете передать любой вызываемый объект для вашей функции f, включая указатели на функции (которые используются в приведенном выше примере), функторы, лямбды и все остальное, что может быть вызвано.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector