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

Chr*_*lin 6 c++

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

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

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

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

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... */ } 
Run Code Online (Sandbox Code Playgroud)

但是,我不能将运算符作为指针传递(这是因为它是本机类型的运算符吗?),所以我尝试使用函数对象.最初我认为multipliesdividesfunctor <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... */ } 
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*tos 11

使TransformData成为模板函数:

template <typename F>
typename F::result_type TransformData(double data, F f) { ... }
Run Code Online (Sandbox Code Playgroud)

这样称呼它:

double MultiplyData(double data) {
    return TransformData(data, std::multiplies<double>());
}
Run Code Online (Sandbox Code Playgroud)

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

  • 您的函数和函数模板需要返回类型. (2认同)