防止代码重复:两个长函数仅在内部循环中不同

Code duplication prevention : 2 long functions differing only in inner loop

本文关键字:函数 在内部 循环 两个 代码      更新时间:2023-10-16

我有两个函数,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,包括函数指针(在上面的示例中使用)、函数、lambdas和其他所有可以调用的对象。