2

我有一种情况,我有一系列成员函数,它们产生关于目标对象的简单信息:

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

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

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

您会注意到漂亮打印机函数采用数据函数——即它是可组合的,因此我可以创建有关目标的各种类型的信息并为其生成“漂亮打印”字符串。

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

但是,我目前的应用程序真正想要的是组合这些实体的多层 - 即有效地为上述组合整体创建一个仿函数(函数对象),这样我就可以指定漂亮的打印机函数,它是数据 -获取函数,稍后调用。模式是 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 -> F(x, G(x)) 的位置组合 Z?

感谢您的任何帮助!

4

1 回答 1

2

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

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

这在标题为“使用嵌套绑定进行函数组合”的文档部分中进行了概述。

于 2012-05-21T14:53:21.493 回答