我有以下问题。 我已经编写了以下方法。 设置标志后,将使用哪个版本。

#define version2
void calc(double &x
 #ifdef version2
   , double &dot_x
 #endif){
   for(int i=0;i<n;i++){
     double data[]=[... expensive computation ...];
     x=[... something depending on data...];
     #ifdef version2
       dot_x=[... something depending on data ...];
     #endif
   }
}

但是现在,我需要同时使用两个版本,并且我不想复制它。 因为我每次都必须在两个版本的数据计算上进行更改。 是否有可能在一个地方实现两个版本(例如makro等)? 如果没有if判定,那要花时间吗?

非常感谢您的回答,

kildschrote

===============>>#1 票数:2 已采纳

只需定义函数的2个重载,一个重载一个参数,一个重载2:

void calc(double &x){...}

void calc(double &x, double &dot_x){...}

并分解出通用代码。 然后,您可以(在运行时或在编译时,通过#ifdef )确定要调用的重载之一。

您甚至只能定义一个版本,并使用默认的第二个参数(指针类型),

void calc(double &x, double *dot_x = nullptr){...}

如果未明确指定第二个参数(即为nullptr ),则进行“便宜”计算,否则,进行“昂贵”计算。

我会尽可能避免使用宏(除非确实必要),因为它们会使您的代码可读性降低并引起讨厌的副作用。

===============>>#2 票数:0

您可以使用模板来“编写”函数的两个版本:

template<typename FUNCTOR>
void calc_impl(double &x, FUNCTOR f){
   for(int i=0; i<n; i++){
     double data[] = [... expensive computation ...];
     x = [... something depending on data...];
     f(data);
   }
}

namespace NULL_F{
   struct F{
     void operator(double data[]){}
   };
}
namespace OPERATE_F{
   struct F{
     F(double &d_x): dot_x(d_x) {}
     void operator(double data[]) {
       dot_x = [... something depending on data ...];
     }
     double &dot_x;
   };

}


void calc(double &x){
   calc_impl(x, NULL_F::F());
}

void calc(double &x, double &dot_x){
   calc_impl(x, OPERATE_F::F(dot_x));
}

模板函数calc_impl与包含所有内容的函数等效。

calc的两个重载选择运行哪个版本,使用两个函子之一执行任何操作或使用double data[]写入dot_x

  ask by kildschrote translate from so

未解决问题?本站智能推荐: