所以我拥有的是:
两个元素范围:
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,但似乎也无济于事。
任何想法的人?
答案 0 :(得分:0)
为什么你不能做一些简单的事情:
BOOST_FOREACH(int v,v1) { BOOST_FOREACH(字符串&amp; s,v2) { bar(v,s); } }