2010-10-24 60 views
2

說我有結合的std ::函數對象

double xSquared(const double) 
{ 
    return x*x; 
} 

... 
std::function<double (double)> func = &xSquared; 
... 

的正常工作,因爲我用這個結構,直至現在的(更復雜)的目的。現在我有一個接受上述形式的一個std ::功能的功能,我需要建立一個新的std ::功能擴展原文:

typedef std::function<double (double)> func1D; 

double someFunction(const func1D &func, const double a) 
{ 
    func1D extendedFunc = func/(x-a); // I know this is incorrect, but how would I do that? 
    ... 
} 

所以數學相當於是:

F(X)= X 2

G(X)= F(X)/(XA)

我怎樣才能做到這一點?謝謝您的幫助!

+0

我已經發現了這個問題,但我不知道如何把它翻譯成我的std的C++ 0x情況:HTTP:// stackoverflow.com/questions/2841619/function-composition-in-c任何幫助非常感謝! – rubenvb 2010-10-24 13:26:27

回答

8

由於您已經在使用C++ 0x,爲什麼不直接使用lambda表達式呢?

func1D divideByXMinusA(const func1D& f, double a) { 
    return [=](double x) { return f(x)/(x-a); }; 
} 

編輯:使用std::bind

func1D divideByXMinusA_withBind(const func1D& f, double a) { 
    using namespace std::placeholders; 
    return std::bind(std::divides<double>(), 
          std::bind(f, _1), 
          std::bind(std::minus<double>(), _1, a)); 
} 
+0

好吧,看起來不錯,但有沒有辦法只使用綁定和功能來做到這一點?試圖保持我的編譯器要求GCC 4.4(它不喜歡拉姆達的非常:s)。 – rubenvb 2010-10-24 13:33:50

+0

@rubenvb:查看更新。 – kennytm 2010-10-24 13:39:41

+0

@KennyTM:你是男人!感謝閃電般的快速解決!只是出於好奇:這種方法可以用來粘合更復雜的函數(通過將std :: divides和std :: minus調用替換爲更復雜的東西)? – rubenvb 2010-10-24 13:46:34