У меня есть две функции, 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>();
}
Мои вопросы:
Похоже ли это на справедливое решение?
Из интереса, есть ли решение, которое не использует шаблоны?
Вместо того, чтобы иметь 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
, включая указатели на функции (которые используются в приведенном выше примере), функторы, лямбды и все остальное, что может быть вызвано.
Других решений пока нет …