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

前端之家收集整理的这篇文章主要介绍了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&C++相关文章