【问题标题】:boost bind class function pointerboost绑定类函数指针
【发布时间】:2011-08-05 14:28:24
【问题描述】:
class Foo 
{
    double f1( int x, std::string s1 );
    double f2( int x, SomeClass s2 );
}

我希望能够绑定 Foo.f1 的 s1 而无需在本质上创建 foo 实例

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 的声明是什么?

【问题讨论】:

  • 这取决于 SomeOtherFunction 的声明。请注意,您的第二个 typedef not 是函数指针,它是指向成员函数 (PTMF) 的指针,这是一个完全不同且不兼容的概念。将所有内容包装在 std::functionstd::tr1::functionboost::function 中可能是最强大的解决方案。
  • 这里实际上有两个问题:1) 没有实例绑定PTMF。 2) 将绑定的结果表示为 boost 函数。对于 1),我尝试了 boost::bind( &Foo::f1, _1, _2, "hello" )。那没有用。对于 2),我怀疑它是 boost::function,int) >.

标签: c++ boost-bind boost-function


【解决方案1】:
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&lt;double(Foo&amp;, int)&gt; 是一种可能,但不是唯一的选择。


我们现在需要为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)

【讨论】:

    【解决方案2】:

    试试这个:

    boost::bind(&Foo::f1, object, _1, _2);
    

    object 是类 Foo 的一个实例。 _1 和 _2 是参数占位符。

    【讨论】:

    • 可能只有一个占位符,因为 OP 想要 Foo::f1(int) 我想...
    • 注意如果object是一个值而不是一个指针,你应该做boost::ref(object)或者&amp;object,否则binder会操作一个副本。
    • 很抱歉给您带来了困惑。我想将 Foo (object) 的实例和非统一参数 (s1,s2) 的绑定分为 2 个步骤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多