1

我有两个函子:

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); 

我如何指定功能基金,即在它前面代替 ?? _ ?? ?

4

2 回答 2

4

您可以简单地使用模板来完成

template <class F>
double squarer(double x, F& func) {
      double y = func(x);
      return y * y;
}
于 2013-04-25T16:52:36.913 回答
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;
}

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

于 2015-11-25T14:35:48.277 回答