c – 如何将运算符作为参数传递

我必须从文件中加载一个双精度数组,将每个元素乘以一个表中的值(不同元素的不同值),对它做一些工作,反转乘法(即除法),然后将数据保存回来提交.

目前,我用两种不同的方法实现乘法和除法过程.现在幕后有一些额外的工作,但除了发生乘法/除法的特定陈述之外,其余代码是相同的.可以想象,通过这种方法,您必须非常小心地进行任何更改.周围的代码并不简单,因此它可以是手动编辑每个方法或将更改从一个方法复制到另一个方法并记住更改*和/运算符的情况.

经过太多的关闭调用之后,我厌倦了这个并且希望创建一个实现公共逻辑和两个包装函数的通用函数,它们将哪个运算符用作参数.

我最初的方法是使用函数指针:

void MultiplyData(double data)  
{ TransformData(data,&(operator *));  } 

void DivideData(double data)  
{ TransformData(data,&(operator /));  }  

void TransformData(double data,double (*func)(double op1,double op2))  
{  /* Do stuff here... */ }

但是,我不能将运算符作为指针传递(这是因为它是本机类型的运算符吗?),所以我尝试使用函数对象.最初我认为在< functional>中乘以和分开算函数会是理想的:

void MultiplyData(double data)  
{  
    std::multiplies<double> multFunct;  
    TransformData(data,&multFunct);  
}

void DivideData(double data)  
{  
    std::divides<double> divFunct;  
    TransformData(data,&divFunct);  
}

void TransformData(double data,std::binary_function<double,double,double> *funct)  
{  /* Do stuff here... */ }

正如您所看到的,我试图使用基类指针以多态方式传递函子.问题是std :: binary_function没有声明要实现的子类的operator()成员.

有什么我缺少的,或者是实现我自己的仿函数heirarchy的解决方案(这看起来真的比它的价值更麻烦)?

解决方法

使TransformData成为模板函数
template <typename F>
typename F::result_type TransformData(double data,F f) { ... }

这样称呼它:

double MultiplyData(double data) {
    return TransformData(data,std::multiplies<double>());
}

std :: binary_function是一个标记类.它的主要目的不是提供基类接口,而是将一些typedef注入到仿函数式类中(通过继承),这使得它们可以被标准库的其他部分使用.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...