【发布时间】:2013-12-23 18:28:47
【问题描述】:
所以我拥有的是:
两个范围的元素:
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 ) ) );
我的第一个想法是绑定内部 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,但似乎也无济于事。
各位有什么想法吗?
【问题讨论】:
标签: c++ boost-bind