class Foo
{
double f1( int x, std::string s1 );
double f2( int x, SomeClass s2 );
}
我希望能够在没有foo实例的情况下绑定Foo.f1的s1以在essense中创建
typedef double (Foo::* MyFooFunc)( int )
MyFooFunc func1 = boost::bind( &Foo::f1, _1, _2, "some string" );
MyFooFunc func2 = boost::bind( &Foo::f2, _1, _2, SomeClass );
然后我将func1和func2作为参数传递给其他函数,其中Foo最终被绑定在其中:
void SomeOtherFunction( MyFooFunc func )
{
Foo foo;
boost::function< double (int) > finalFunc =
boost::bind( func, foo, _1 );
}
问题: 这可能吗?如果是,1)如何实现它? 2)MyFooFunc的声明是什么?
答案 0 :(得分:4)
typedef double (Foo::* MyFooFunc)( int );
MyFooFunc func1 = boost::bind( &Foo::f1, _1, _2, "some string" );
boost::bind
的结果不是指向成员的指针,因此func1
无法在第二行上初始化。 boost::bind
的结果是未指定的类型(取决于参数)。如果您使用的是C ++ 0x,则将bind
调用结果命名的最简单方法是使用auto
:
auto func1 = boost::bind( &Foo::f1, _1, _2, "some string" );
另一种简单的方法(不限于C ++ 03)只是不命名结果,而是在现场使用它:
SomeOtherFunction(boost::bind(&Foo::f1, _1, _2, "some string"));
或者,您可以使用类型删除将boost::bind
的结果存储到您似乎熟悉的boost::function
中。 boost::function<double(Foo&, int)>
是可能的,但不是唯一的选择。
我们现在需要找到SomeOtherFunction
的相应签名:再次,无法从调用boost::bind
的结果初始化指向成员的指针,因此void SomeOtherFunction(MyFooFunc func);
赢了工作。您可以将该功能改为模板:
template<typename Func>
void SomeOtherFunction( Func func )
{
Foo foo;
boost::function< double (int) > finalFunc =
boost::bind( func, foo, _1 );
}
如果模板不是优选的,那么你必须使用某种类型的擦除,例如boost::function
。
void SomeOtherFunction(boost::function<double(Foo&, int)> const& func);
(再次可以使用其他boost::function
类型,具体取决于传递ref-to-const而不是ref-to-non-const等细节
答案 1 :(得分:0)
试试这个:
boost::bind(&Foo::f1, object, _1, _2);
object
是Foo类的一个实例。
_1和_2是参数占位符。