函数指针的操作

问题描述 投票:0回答:1

我正在努力弄清楚函数指针和 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;
}
c++ class lambda operator-overloading function-pointers
1个回答
0
投票

要使用函数指针,您需要一个函数。您无法即时创建函数。当 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);
}

现场演示

© www.soinside.com 2019 - 2024. All rights reserved.