如何在 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
].
我有以下问题。我编写了以下方法。设置了标志,使用哪个版本。
#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
].