C++函数的运算符重载

C++ Operator Overload for Functions

本文关键字:重载 运算符 函数 C++      更新时间:2023-10-16

我正在编写一个程序,我希望最终能够在double上执行一些标准操作(例如+,-,*( -double函数(按double-double函数 我的意思是接受一个类型double的值并吐出其他double类型的东西,无论它们是硬编码还是 lambda(。所以我希望以下示例是可能的:

#include <functional>
double f(double x)
{
return x + 5;
}
double g(double x)
{
return 2 * x;
}
int main()
{
std::function<double(double)> h   = f + g;
std::function<double(double)> h_  = (f - g) * 5;
std::function<double(double)> h__ = f * g;
return 0;
}

我已经尝试了类似于以下形式的东西,但编译器似乎仍然不喜欢我将两个double(double)类型的东西放在一起。

std::function<double(double)> operator+(std::function<double(double)> &f, std::function<double(double)> &g)
{
return [=](double x)->double{ return f(x) + g(x); };
}

我错过了一些明显的东西可以帮助它工作吗?作为当前的解决方法,我正在调用表单函数并使用正确的参数调用它,但我无法让它与运算符自然地工作。

std::function<double(double)> add_two_functions(std::function<double(double)> &f, std::function<double(double)> &g)
{
return [=](double x)->double{ return f(x) + g(x); };
}

你的错误是fg是函数指针,因此operator+不能应用于它们。您需要将这些函数指针强制转换为std::function<double(double)>对象。

类似以下内容的内容将起作用:

#include <iostream>
#include <functional>
double f(double x) {
return x + 5;
}
double g(double x) {
return 2 * x;
}
std::function<double(double)> operator+(std::function<double(double)> const& f,
std::function<double(double)> const& g) {
return [=](double x) -> double {
return f(x) + g(x);
};
}
int main() {
using FuncType = double(double);
std::function<FuncType> a{ reinterpret_cast<FuncType*>(f) };
std::function<FuncType> b{ reinterpret_cast<FuncType*>(g) };
auto h = a + b;
std::cout << h(2.0) << std::endl; // 11
return 0;
}

查看实时示例

f + g中,fg衰减到函数指针。此外,函数指针无效,并且不能重载函数指针的运算符。

也就是说,你真的不需要。 你可以只使用像这样的lambda

int main()
{
auto h   = [](auto var){ return f(var) + g(var); };
auto h_  = [](auto var){ return (f(var) - g(var)) * 5; };
auto h__ = [](auto var){ return f(var) * g(var); };
return 0;
}

是的,它更冗长,但它很清楚你想要发生的事情。