2010-10-24 58 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