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

#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

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

3回复

C ++:为默认方法参数调用另一个方法

我在项目中使用Settings类的默认参数,因此声明的方法少了一些。 例如,我声明了以下方法: 我想要的是这个简化的版本: 但是我在编译时遇到这个错误: 我如何告诉编译器使用Setting对象的当前实例(可通过this获得 )以获取默认值? 顺便说一下,这被授权了
2回复

在C ++中,命名参数的范围是否包含其默认值的表达式?

示例:这是合法的C ++ 14吗? g ++ 5.4 with -std=c++14喜欢它,但是clang ++ 3.8和-std=c++14抱怨:
1回复

C ++模棱两可的重载和默认构造函数

我有一个程序,其代码可以完美地运行,但是编译器仍然会输出以下令人讨厌的警告: 我的程序的简化版本是: 我看不到operator()重载有什么问题。 有任何想法吗?
4回复

C ++重载; 相同类型的可变参数?

我有一个类,其构造函数如下所示: 我想为用户提供具有chunkSizeY或chunkSizeX的默认值(需要由Chunker计算)的功能。 IE,因此它们可能会传递“ AUTO”关键字或诸如此类的内容,以便构造函数知道。 我可以做类似的事情吗? 这样,如果为一个或两个
4回复

当出现模糊的默认参数时,C ++编译器会做什么?

当出现模糊的默认参数时,C ++编译器会做什么? 例如,假设有一个函数,例如: 以上是否被认为含糊不清? 如果没有,那么在调用类似function1(10)东西时,编译器会做什么(函数如何完全匹配function1(10) ? 谢谢!
2回复

最佳实践C ++:对多个方法重用默认参数

给定具有不同功能(功能1和功能2)的头文件:共享相同默认参数的最佳实践是什么? 使用类似 似乎很不方便。 我对C ++相当陌生,因此我不知道这种情况下的最佳实践是什么。 我应该在MyClass内部创建一些私有常量吗?
3回复

在C ++中处理可选参数/默认值的最佳方法

我想知道是否有办法做以下的事情,都有一个功能: 我要做的是将默认值设置为我想要更改的值,这样如果我省略一些参数,那些值就不会改变。 上面的代码不起作用,我想我理解为什么(该函数实际上不能访问这些值,因此它会抛出错误)。 我想知道的是,如果有办法像我上面描述的那样,都有一个功能。
1回复

在C ++中的链接列表方法中,如何将参数默认为其最后一个索引?

我正在尝试在C ++中实现Python的list.pop方法。 该方法将索引作为参数,默认为最后一个索引。 这是一个例子。 我看到的实现此目标的唯一方法是将列表的大小包含在参数的默认值中,但是无法在编译时确定,因此在C ++中不是有效的默认值 。 如何根据需要传递参数?
4回复

不允许C ++中的变量的默认值是非静态方法或类的成员的原因是什么?

我想知道为什么类的方法的变量的默认值,不能是非静态方法或同一类的成员。 这有什么理由吗? 编译器无法向方法提供非静态默认值类中的位置吗? 我试图快速谷歌寻找答案,但我无法得到一个好的答案。 编辑:这是一个例子。 这是合法的: 但这不是:
4回复

函数中的默认参数[C ++]

我试着这样做: 但它不起作用。 它必须通过引用传递。 感谢您的任何帮助。 PS我认为一旦你输入Title就出现“相关问题”是一个好主意,但我也认为只有当它们与特定语言相关时才应该显示它们,即对于我来说看待类似主题并不是没用的问题,但在Ruby中。