带有boost::bind的部分绑定
Partial binding with boost::bind
所以我拥有的是:
两个元素范围:
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);}}
- 为什么 std::bind 绑定到成员函数时无法编译?
- boost::bind 无法绑定到纯虚拟基类中定义的非静态函数模板成员类型
- 如何正确绑定成员函数与 boost::bind
- 我正在尝试制作一个在 std::bind 之前匹配的网络绑定函数
- 为什么 std::bind 在使用按引用传递时防止后期绑定?
- 如何使用 boost::bind 将静态成员函数绑定到 boost::function
- 管理由"std::bind"绑定的成员函数的生存期
- 带有boost::bind的部分绑定
- boost::bind 在 VC++ 2010 中绑定引发异常的函数时不起作用
- std::bind 一个绑定函数
- C++ Boost::bind:指向绑定函数的指针只能用于调用该函数
- 是否可以将 bind() *this 绑定到类成员函数以回调 C API
- std::bind():将lambda与右值引用作为参数绑定
- 如何使用 c++11 std::bind 绑定类中同名的成员函数之一
- 使用boost::bind将成员函数绑定到boost::bisect
- c++ 11: bind std::sort用于用户定义的类型,然后使用该绑定作为ctor的参数
- 是否有可能将boost::bind绑定到已知类但(尚未)未知对象的成员函数?
- 使用boost::bind与boost::function:检索绑定变量类型
- std::bind 绑定"by value",这是真的吗?
- 使用 boost::bind 创建绑定自动释放"heap"资源的函数对象