c++ - 如何使用 boost bind 组合多个仿函数?

标签 c++ boost lambda boost-bind

我遇到过这样的情况:我有一系列成员函数,它们可以生成有关目标对象的简单信息:

double MyDoc::GetX(thing)
double MyDoc::GetY(thing)
etc.

我在同一个类中制作了一些“漂亮的格式化”成员函数:

string MyDoc::PrintOne(thing, std::function<double (THING*)>)

您会注意到, pretty-print 函数采用数据函数 - 即它是可组合的,以便我可以创建有关目标的各种类型的信息并为其生成“ pretty-print ”字符串。

在直接使用中,这种技术效果非常好。

但是,我当前的应用程序真正想要的是组合此类实体的多个层 - 即有效地为上述组合创建一个仿函数(函数对象)作为一个整体,这样我就可以指定 pretty-print 函数,并且它是数据采集函数,稍后调用。模式是 z(x) -> f(x, g(x)):

auto Z = [&] (THING* thing) {
    return boost::bind(
        &MyDoc::PrintOne,
        this,
        _1,
        boost::bind(MyDoc::GetX, this, _1));
}

这就是我遇到问题的地方。我一直在试图让语法正确,或者也许我对 boost::bind 语法与 C++ lambda 语法感到困惑,或者也许我只是从根本上误解了某些东西?

基本上,我想编写一个函数 Z,它接受一个 THING* 和另一个函数 X,它也接受一个 THING*,并使用它自己的逻辑,为给定的 THING* 生成字符串输出。

我有一些变体 - 有些采用两个数据访问器类型函数,或者可能是一个 bool + 数据访问器。并不重要 - 底线应该是相同的:

如何组合 Z,其中 Z -> F(x, G(x))?

感谢您的帮助!

最佳答案

boost::bind (和 std::bind )eagerly 计算嵌套绑定(bind)表达式,因此您拥有的内容将与签名 string MyDoc::PrintOne(THING*, double) 匹配。要防止急切求值并直接返回嵌套绑定(bind)表达式(适合构造 std::function<> ),请使用 boost::protect :

boost::bind(
    &MyDoc::PrintOne,
    this,
    _1,
    boost::protect(boost::bind(&MyDoc::GetX, this, _1))
)

标题为“using nested binds for function composition ”的文档部分对此进行了概述。

关于c++ - 如何使用 boost bind 组合多个仿函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10687316/

相关文章:

java - try/catch 语句中有效最终变量的赋值

c++ - 控制台(显示)中的双缓冲?

c++ - 为什么 QWidget::paintEvent 没有被调用?

c++ - 掌握C++为大二做准备: How?

c++ - 段错误 : 11 - Where is it?

c++ - BOOST_PP_VARIADIC_SIZE 未扩展

function - 如何返回带有守卫和双重递归的 lambda?

c++ - 函数拒绝在 Boost 测试函数中工作

c++ - 这是 boost::iterator_facade 的 boost::range_detail::demote_iterator_traversal_tag 中的错误吗?

C++11 lambda : mixed capture list