功能组合运算符

时间:2014-06-01 19:34:24

标签: c++ composition std-function

作为C ++中函数式编程的一个小练习,我想重载operator*以允许我编写2个函数。

让我感到困惑的是,如果我像这样定义我的运算符:

std::function<float(float)> operator*(std::function<float(float)> func1, std::function<float(float)> func2)
{
   // ...
}

我无法在常规功能中使用它,如:

float f(float);
float g(float);
auto composite = f*g;

因为我得到了:
error: invalid operands of types ‘float(float)’ and ‘float(float)’ to binary ‘operator*’

如果我尝试仅添加一个函数指针版本:

std::function<float(float)> operator*(float(*func1)(float) , float(*func2)(float))
{
   return [func1, func2](float x) { return func1(func2(x)); };
}

我收到此错误:
error: ‘std::function<float(float)> operator*(float (*)(float), float (*)(float))’ must have an argument of class or enumerated type

我能够通过添加a make_function helper来实现它,但这确实使代码变得丑陋。

有没有办法让这个运算符自动将函数转换为std::function个实例?

1 个答案:

答案 0 :(得分:4)

不幸的是,C ++不允许运算符因内置类型而过载。正如您无法为两个operator*实现自己的int一样,您无法为两个函数指针实现它,除非您使用类std::function类型表示这些函数,因此不是内置类型。

但是,您可以使用函数来代替使用运算符:

std::function<float(float)> dot(float(*func1)(float) , float(*func2)(float))
{
   return [func1, func2](float x) { return func1(func2(x)); };
}