我遇到过这样的情况:我有一系列成员函数,它们可以生成有关目标对象的简单信息:
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/