【问题标题】:boost::bind() a member function to boost::function with object pointer as placeholder?boost::bind() 使用对象指针作为占位符的 boost::function 的成员函数?
【发布时间】:2013-09-21 03:40:01
【问题描述】:

我在 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 传递给一个以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。不知道如何连接这两者,也不知道为什么会发生编译器错误。

【问题讨论】:

  • 你得到什么错误?
  • 可以发A::foo1的签名吗?您可能应该将 A 的实例作为第二个参数传递给 bind
  • 用错误代码和示例代码更新了我的原始帖子。
  • thisdostuff 有什么关系?那不是成员函数,所以对象将无法调用它...
  • 您必须在dostuff(早期)或process(晚期)中绑定您的对象引用。你打算在process做吗?

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


【解决方案1】:

首先,您需要在 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;

【讨论】:

    猜你喜欢
    • 2010-12-27
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    相关资源
    最近更新 更多