C++传递的功能,一个功能使用仿函数

问题描述:

我有两个函子: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); 

如何指定功能的基金,也就是在它前面发生的事情的地方_ ?? ?

你可以简单地用模板

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

+1好工作! :) – 0x499602D2 2013-04-25 20:35:10

我不是在上面的模板答案敲做到这一点。事实上,它可能是两者中更好的选择,但我想指出,这也可以用多态来完成。例如...

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

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