【问题标题】:C++ Passing a function to a function using functorsC++ 使用函子将函数传递给函数
【发布时间】:2013-04-25 16:50:45
【问题描述】:

我有两个函子:

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

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

【问题讨论】:

    标签: c++ function functor


    【解决方案1】:

    你可以简单地用模板来做

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

    【讨论】:

      【解决方案2】:

      我不是在敲上面的模板答案。事实上,这可能是两者中更好的选择,但我想指出,这也可以通过多态来完成。比如……

      #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;
      }
      

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

      【讨论】:

        猜你喜欢
        • 2017-12-13
        • 2015-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-26
        • 2014-06-28
        相关资源
        最近更新 更多