我正在努力弄清楚函数指针和 lambda 函数的语法,我需要一些帮助。
我想做的是创建一个具有参数函数指针的类,并且能够添加、减去、组合两个函数。我怎样才能实现这些?
代码:
typedef int (*mathFunc)(int);
class MathFunc {
mathFunc func = nullptr;
public:
MathFunc()=default;
MathFunc(mathFunc func) : func(func) {};
// Addition
MathFunc& operator+=(const MathFunc &f) {
// This doesn't work
this->func = [](int16_t){return this->func + *f.func};
return *this;
}
// Composition
MathFunc operator()(const MathFunc &f) {
// This doesn't work either
MathFunc result(this->func(*f.func));
return result;
}
};
MathFunc operator+(const MathFunc &f1, const MathFunc &f2) {
MathFunc result(f1);
result += f2;
return result;
}
要使用函数指针,您需要一个函数。您无法即时创建函数。当 Lambda 没有捕获时,它们可以衰减为函数指针,但您希望新函数存储其组件。因此,裸函数指针是错误的工具。
此外,对于在代码或问题中添加两个函数实际上意味着什么,并没有明确的概念。我想您希望
f+g
(f 和 g 函数)为 f(x) + g(x)
。
您可以使用
std::function<int(int)>
。我只会通过 operator+=
概述方法,并将 operator+
和构图留给您,因为它非常相似:
#include <functional>
#include <iostream>
struct my_func {
std::function<int(int)> f;
my_func& operator+=(const my_func& other) {
f = [g = other.f,h = f](int x) { return g(x) + h(x);};
return *this;
}
};
int main()
{
my_func a{ [](int x){ return x*2;}};
my_func b{ [](int x){ return x+2;}};
a += b;
std::cout << a.f(1);
}