C ++使用仿函数将函数传递给函数

时间:2013-04-25 16:50:46

标签: c++ function functor

我有两个仿函数:

class SFunctor {
public:
    SFunctor(double a) { _a = a; }
    double operator() (double t) { return _a * sin(t); }
private:
    double _a;
};

class CFunctor {
public:
    CFunctor(double b) { _b = b; }
    double operator() (double t) { return _b * cos(t); }
private:
    double _b;
};

我想将这些函数中的一个或另一个传递给另一个函数:

double squarer(double x, ??______?? func) {
      double y = func(x);
      return y * y;
}

在我的主程序中,我想打个电话:

CFunctor sine(2.);
SFunctor cosine(4.);
double x= 0.5;
double s = squarer(x, sine);
double c = squarer(x, cosine); 

我如何指定功能基金,这就是它前面的代码? _ ?? ?

2 个答案:

答案 0 :(得分:4)

您只需使用模板

即可
template <class F>
double squarer(double x, F& func) {
      double y = func(x);
      return y * y;
}

答案 1 :(得分:0)

我没有敲开上面的模板答案。事实上,它可能是两者中更好的选择,但我想指出这也可以通过多态来完成。例如......

#include <math.h>
#include <iostream>
using std::cout;
using std::endl;

class BaseFunctor {
 public:
   virtual double operator() (double t) = 0;
 protected:
   BaseFunc() {}
};

class SFunctor : public BaseFunctor {
 public:
   SFunctor(double a) { _a = a; }
   double operator() (double t) { return _a * sin(t); }
 private:
   double _a;
};

class CFunctor : public BaseFunctor {
 public:
   CFunctor(double b) { _b = b; }
   double operator() (double t) { return _b * cos(t); }
 private:
   double _b;
};

double squarer(double x, BaseFunctor& func) {
   double y = func(x);
   return y * y;
}

int main() {
   SFunctor sine(.2);
   CFunctor cosine(.4);
   double x = .5;
   cout << squarer(x,sine) << endl;
   cout << squarer(x,cosine) << endl;
}

我确保这是一个完整的工作演示,所以你可以复制它来测试它。您将确实观察到两个不同的数字打印到终端,从而证明多态可以与仿函数一起使用。同样,我并不是说这比模板答案更好,我只想指出它不是唯一的答案。即使这个问题已得到解答,我希望这有助于通知任何想要获得通知的人。