[英]boost::bind() a member function to boost::function with object pointer as placeholder?
我在MSVC7上使用boost v1.37。 我停留在这些旧版本上,无法升级,因此请在这里尽我所能,不要提出升级建议。
我有一个包含三个成员函数的类。 我想定义一个boost::function
,可用于在同一类的不同实例上调用不同的成员函数:
typedef boost::function<bool (unsigned, unsigned)> MyFunc;
绑定看起来像:
boost::bind( &A::foo1, _1, _2, _3, boost::ref(some_fixed_param) );
我需要boost::bind
上面的boost::bind
传递给一个以MyFunc
作为参数的函数。
我如何设置我的boost::function
来获取将实例对象设置为占位符的函数对象(来自boost::bind
)? 如何将实例( this
)传递给boost::function
? 我在这里不断收到编译器错误,因此只是尝试确保自己正确理解了这一点。 希望我已经解释清楚了。 提前致谢。
我得到的真正错误是:
sample.cpp(1156) : error C2664: 'process' : cannot convert parameter 2 from 'boost::_bi::bind_t<R,F,L>' to 'FooFunc &'
with
[
R=bool,
F=boost::_mfi::mf3<bool,A,unsigned int,unsigned int,int>,
L=boost::_bi::list4<boost::arg<1>,boost::arg<2>,boost::arg<3>,boost::reference_wrapper<int>>
]
我正在使用的代码:
typedef boost::function<bool (unsigned, unsigned)> FooFunc;
class A
{
public:
bool foo1( unsigned s1, unsigned s2, int s3 )
{
}
};
bool process( unsigned s1, FooFunc& foo )
{
unsigned s2 = 100;
A* a; // pretend this is valid
return foo( s1, s2 );
}
void dostuff()
{
int s3 = 300;
process( 200,
boost::bind( &A::foo1, _1, _2, _3, boost::ref( s3 ) ) );
}
现在我知道这不是有效的代码,因为在process()
函数中,我某种程度上需要使用实例指针a
调用foo
。 不确定如何连接两者,也不确定为什么发生编译器错误。
首先,您需要在boost :: function的签名中添加对类的引用:
typedef boost::function<bool (A *, unsigned, unsigned)> FooFunc;
这确实需要在此typedef之前声明A类。 然后,在您的process
函数中,可以在调用给定的FooFunc
时提供此参考。
bool process( unsigned s1, FooFunc foo )
{
unsigned s2 = 100;
A* a = 0; // pretend this is valid
return foo( a, s1, s2 );
}
请注意,我还将对FooFunc的非常量引用更改为一个值参数。 然后,其余代码将按原样工作。
我没有访问MSVC7的权限(我确实希望您使用的是7.1,而不是7.0)。 您可能需要按照boost.function文档中的说明使用“便携式语法”,例如:
typedef boost::function<bool , A *, unsigned, unsigned> FooFunc;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.