带有boost::bind的部分绑定

Partial binding with boost::bind

本文关键字:绑定 bind boost 带有      更新时间:2023-10-16

所以我拥有的是:

两个元素范围:

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

接受来自这些范围的元素的功能:

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

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

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

这没关系,但我必须用smth替换lambdas,因为它们是C++11标准的一部分,并且该代码的一些潜在用户仍在C++98上。我已经用functor替换了lambda,但后来我想知道是否可以用单行样式重写它,而不需要额外的对象和/或函数。Functor变体很好,但我想在这里完成探索:)

所以我想要的是这样的东西:

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

我的第一个想法是用void(int)这样的签名将内部for_each绑定到recieve函数,但这对我来说很难,因为for_each只有两个参数-字符串范围和接受一个参数的函子-字符串。对我来说,这意味着我必须在这里使用bindcomposition来扩展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()函数生成的,其参数组合绑定到内部for_each。但我仍然有助手的功能。当我试图摆脱它时,我遇到了一个对我来说似乎无法解决的问题:

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

所以,bar()的第一个绑定参数需要为_1才能使用外部绑定进行组合。但bar()的第二个参数也需要为_1,内部for_each才能在循环中使用绑定函数。所以,现在我需要以某种方式组合绑定第一个参数,并保护第二个参数在绑定时不进行求值。

我发现的最相关的问题就在这里,但似乎也无济于事。

有什么想法吗?

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

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