【问题标题】:Refactoring a nested bind to use a lambda function重构嵌套绑定以使用 lambda 函数
【发布时间】:2019-07-18 03:13:40
【问题描述】:

我在尝试重构一些使用嵌套绑定的遗留代码时遇到了困难。

这些示例显示了简单的实例,但当绑定与具有占位符的内部绑定嵌套时无济于事。

任何提示将不胜感激。

我们使用的是 C++11。

return std::any_of(_vector.begin(), _vector.end(), std::bind(&Foo, std::bind(&Bar, std::placeholders::_1)));                                                                                

这可以用两个嵌套的 lambda 来完成,还是可以用一个来完成?

【问题讨论】:

  • [](const T& val) { return Foo(Bar(val)); }
  • @paddy 这就是答案。
  • 你还能在 std::any_of 中将其组合为内联吗?牙套好像有问题。
  • std::any_of(v.begin(), v.end(), [](const T&) { ... }) 对我来说似乎很好。
  • 它在抱怨大括号...:/

标签: c++ c++11 lambda refactoring bind


【解决方案1】:

每个bind 都可以简单地更改为 lambda。您需要记住的是,bind 都返回“函数对象”,而 lambda 生成“函数对象”,因此您只需要在原型和功能方面构造等效的“函数对象”。 IE。对于简单的bind,它是这样的:

x = std::bind(&foo, arg1, arg2, ..., argX);

λ 是

x = [](T1 val1, T2 val2, ..., Ty valY) {return foo(arg1, arg2, ..., argx);}

每个占位符应替换为对应的valY

所有内部绑定都可以视为函数调用。

即你的情况应该是这样的:

return std::any_of(_vector.begin(), _vector.end(), [](T1& val1) {return Foo(Bar(val1);});

如果您的编译器抱怨大括号,请确保您为 C++11 编译,例如GCC 有--std=C++11

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-03
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    相关资源
    最近更新 更多