繁体   English   中英

boost绑定类函数指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM