gpt4 book ai didi

c++ - 使用 boost::bind 进行部分绑定(bind)

转载 作者:太空狗 更新时间:2023-10-29 23:17:03 25 4
gpt4 key购买 nike

所以我所拥有的是:

两个范围的元素:

std::vector<int> v1;
std::vector<string> v2;

接受这些范围内元素的函数:

void bar( int x, std::string str );

我想做的是将处理程序应用于 v1 和 v2 的乘积的每一对。所以我得到了这样的东西:

using namespace boost;
for_each( v1, [&]( int x )
{ for_each( v2, bind( bar, x, _1 ) ); }
);

没关系,但我必须用 smth else 替换 lambda,因为它们是 C++11 标准的一部分,并且此代码的​​一些潜在用户仍在使用 C++98。我已经用仿函数替换了 lambda,但后来我想知道是否可以在没有附加对象和/或函数的情况下以单行样式重写它。 Functor 变体很好,但我想在这里完成探索:)

所以我想要的是这样的:

for_each( v1, for_each( v2, bind( bar, ???, _1 ) ) );

我的第一个想法是绑定(bind)内部 for_each 以接收带有 void(int) 之类签名的函数,但这对我来说很难,因为 for_each 只有两个参数 - 字符串范围和接受一个参数的仿函数 - 字符串。这对我来说意味着我必须在此处使用绑定(bind)组合来扩展 for_each 签名,以便它将从第一个范围接收 int 元素。在从 boost::for_each 获取地址后,我得到了这段代码:

typedef boost::function<void(std::string)> StrFunc;
typedef std::vector<std::string> StrRange;

StrFunc maker(int i) {
return bind( bar, i, _1);
}

for_each(
v1,
bind(
static_cast< StrFunc (*) (const StrRange&, StrFunc)>(
for_each<StrRange, StrFunc> ),
v2,
bind( maker, _1 )
)
);

此代码也有效 - 一元可调用对象由 maker() 函数创建,其参数组合绑定(bind)到内部 for_each。但我仍然有辅助功能。当我试图摆脱它时,我遇到了问题,这对我来说似乎无法解决:

for_each(
v1,
bind(
static_cast< StrFunc (*) (const StrRange&, StrFunc)>(
for_each<StrRange, StrFunc> ),
v2,
bind( bar, _1, _1 ) //wat?
)
);

因此,bar() 的第一个绑定(bind)参数需要是 _1 才能与外部绑定(bind)组合。但是 bar() 的第二个参数也需要是 _1 内部 for_each 才能在循环中使用绑定(bind)函数。所以,现在我需要以某种方式组合绑定(bind)第一个参数,并保护第二个参数在绑定(bind)时不被评估。

我发现最相关的问题是 here ,但似乎也无济于事。

有什么想法吗?

最佳答案

为什么你不能做一些像这样简单的事情:

BOOST_FOREACH(int v, v1) { BOOST_FOREACH(字符串 &s, v2) { 栏(v,s); }

关于c++ - 使用 boost::bind 进行部分绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20749165/

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