微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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注入到仿函数式类中(通过继承),这使得它们可以被标准库的其他部分使用.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐