使用boost :: bind进行部分绑定

时间:2013-12-23 18:28:48

标签: c++ boost-bind

所以我拥有的是:

两个元素范围:

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

接受来自theese范围的元素的函数:

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替换lambdas,因为它们是C ++ 11标准版的一部分,而且这些代码的一些潜在用户仍然在C ++ 98上。我用functor替换了lambda,但后来我想知道是否可以用oneline样式重写它,而不需要额外的对象和/或函数。 Functor变体很好,但我想在这里完成探索:)

所以我想要的是这样的:

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

我的第一个想法是将内部for_each绑定到像void(int)这样的签名来接收函数,但是由于for_each只有两个参数 - 字符串范围和接受一个参数的函子 - 字符串,所以我很难。这对我来说意味着我必须在这里使用绑定组合来扩展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在循环中使用绑定函数。所以,现在我需要以某种方式合成第一个参数,并保护第二个参数不受绑定时间的评估。

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

任何想法的人?

1 个答案:

答案 0 :(得分:0)

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

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