【问题标题】:Combining std::function objects组合 std::function 对象
【发布时间】:2010-10-25 14:50:39
【问题描述】:

说我有

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

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

到目前为止,这对于我使用这种结构的(更复杂的)目的来说效果很好。现在我有一个接受上述形式的 std::function 的函数,我需要创建一个扩展原始 std::function 的新函数:

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)

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

【问题讨论】:

标签: c++ c++11 functional-programming


【解决方案1】:

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

【讨论】:

  • 好吧,看起来不错,但是有没有办法只使用绑定和函数来做到这一点?试图将我的编译器要求保持在 GCC 4.4(它不太喜欢 lambda :s)。
  • @KennyTM:你就是那个男人!感谢闪电般的快速响应!只是出于好奇:这种方法可以用来将更复杂的功能粘合在一起(通过将std::dividesstd::minus 调用替换为更复杂的东西)?
  • 我想指出这两种变体并不等同。在第一个示例中,您通过引用捕获 f,在第二个示例中,复制了 f 引用的 std::function 对象。
  • @sellibitze:如果您知道如何做得更好,我很想学习,请发布一个新答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多