代码之家  ›  专栏  ›  技术社区  ›  rubenvb

组合std::函数对象

  •  2
  • rubenvb  · 技术社区  · 14 年前

    说我有

    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

    g(x)=f(x)/(x-a)

    我怎样才能做到这一点?谢谢你的帮助!

    1 回复  |  直到 14 年前
        1
  •  8
  •   kennytm    14 年前

    既然你已经使用了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));
    }