C++函数的运算符重载
C++ Operator Overload for Functions
我正在编写一个程序,我希望最终能够在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); };
}
你的错误是f
和g
是函数指针,因此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
中,f
和g
衰减到函数指针。此外,函数指针无效,并且不能重载函数指针的运算符。
也就是说,你真的不需要。 你可以只使用像这样的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;
}
是的,它更冗长,但它很清楚你想要发生的事情。
相关文章:
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 在 myVector 类中重载运算符 + 时出错
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 如何在 cpp 中重载运算符 +=?
- C++ 如何重载 [] 运算符并进行函数调用
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 重载运算符有地址吗?
- 如何迭代重载运算符 [] 的类?
- 重载运算符与添加问题
- 模板基类中的重载运算符
- 如何调用用于重载运算符"<<"的 friend 函数?
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- 重载运算符<<采用谷歌 C++ 风格
- C++ 如何正确重载 + 运算符
- cout (<<) 重载运算符不打印减去的矩阵
- 如何在 c++ 中重载运算符 + 以便能够 whrite c_str = "smth" + c_str;
- 重载运算符*以获取对另一个类的实例的引用