繁体   English   中英

boost :: bind()是成员函数以对象指针作为占位符来增强boost :: function的成员函数吗?

[英]boost::bind() a member function to boost::function with object pointer as placeholder?

我在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上面的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 不确定如何连接两者,也不确定为什么发生编译器错误。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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