gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:55:16 25 4
gpt4 key购买 nike

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

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

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

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

您会注意到 pretty-printer 函数采用数据函数 - 即它是可组合的,因此我可以创建关于目标的各种类型的信息并为其生成“ 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 语法感到困惑,或者我可能只是从根本上误解了某些东西?

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

我有变体 - 有些采用两个数据访问器类型的函数,或者可能是 bool + 数据访问器。没关系——底线应该是一样的:

如何在 Z -> F(x, G(x)) 处组合 Z?

感谢所有帮助!

最佳答案

boost::bind (和 std::bind )急切 评估嵌套的绑定(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com