作为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
个实例?
答案 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)); };
}