我有一种情况,我有一系列成员函数,它们产生关于目标对象的简单信息:
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?
感谢您的任何帮助!