[英]boost bind class function pointer
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的声明是什么?
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"));
或者,您可以使用type-erasure将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)
试试这个:
boost::bind(&Foo::f1, object, _1, _2);
object
是Foo类的一个实例。 _1和_2是参数占位符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.