2013-04-25 50 views
1

我有兩個函子: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); 

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

回答

4

你可以簡單地用模板

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

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

我確保這是一個完整的工作演示,所以你可以複製它來測試它。您確實會觀察到兩個不同的數字打印到終端,從而證明多態性可以與函子一起使用。同樣,我並不是說這比模板答案好,我只想指出它不是唯一的答案。即使問題已得到解答,我希望這有助於告訴任何想要通知的人。