如何在 C++ 中创建一个方法的多个版本?

How to create multiple versions of a method in c++?

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

#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-decisions,这会花费时间?

非常感谢您的回答,

基尔德施罗特

只需为您的函数定义 2 个重载,一个接受一个参数,一个接受 2 个参数:

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

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

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

你甚至可以只定义一个版本,带有默认的第二个参数(指针类型),

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

如果没有明确指定第二个参数(即留下 nullptr),则进行 "cheap" 计算,如果没有,则进行 "expensive" 计算。

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

您可以为函数的两个版本'write'使用模板:

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 select 的两个重载版本是 运行,使用两个仿函数之一不执行任何操作或使用 [=14= 写入 dot_x ].