C++ Передача функции в функцию с помощью функторов

У меня есть два функтора:

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

Как мне указать функцию fund, то есть то, что идет перед ней вместо ??_?? ?


person user2320645    schedule 25.04.2013    source источник


Ответы (2)


Вы можете просто сделать это с помощью шаблонов

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

Я не стучу в приведенный выше шаблонный ответ. На самом деле, это может быть лучший выбор из двух, но я хотел указать, что это можно сделать и с помощью полиморфизма. Например...

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

Я позаботился о том, чтобы это была полностью рабочая демонстрация, поэтому вы можете просто скопировать ее, чтобы протестировать. Вы действительно увидите, что на терминал выводятся два разных числа, что доказывает, что полиморфизм можно использовать с функторами. Опять же, я не говорю, что это лучше, чем шаблонный ответ, я просто хотел указать, что это не единственный ответ. Несмотря на то, что на вопрос был дан ответ, я надеюсь, что это поможет сообщить всем, кто хочет быть в курсе.

person Jeremiah Zucker    schedule 25.11.2015