boost :: bind如何调用私有方法?

时间:2011-06-30 16:40:38

标签: c++ boost bind functor

boost :: bind在很多情况下都非常方便。其中之一是调度/发布一个方法调用,以便io_service稍后可以进行调用。

在这种情况下,boost :: bind的行为可能是人们所期望的:

#include <boost/asio.hpp>
#include <boost/bind.hpp>

boost::asio::io_service ioService;

class A {
public:     A() {
                // ioService will call B, which is private, how?
                ioService.post(boost::bind(&A::B, this));
            } 
private:    void B() {}
};

void main()
{
    A::A();
    boost::asio::io_service::work work(ioService);
    ioService.run();
}

但是,据我所知,boost创建了一个functor(一个带有operator()()的类,能够在给定对象上调用给定的方法。该班级是否可以访问私人B?我猜不是。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:36)

您可以通过指向成员的函数调用任何成员函数,无论其是否可访问。如果该函数是私有的,那么只有成员和朋友可以创建指向它的指针,但任何东西都可以在创建后使用指针。

答案 1 :(得分:8)

通过指向成员函数的指针,boost调用私有函数。该类的成员函数创建指针,并将其传递给boost,稍后,boost使用该指针调用类的对象上的私有函数。

以下是这个基本概念的简单说明:

class A;

typedef void (A::*pf)();

class A 
{
public:     
    pf get_ptr() { return &A::B; } //member function creates the pointer
private:    
    void B() { cout << "called private function" << endl; }
};

int main() {
        A a;
        pf f = a.get_ptr();
        (a.*f)();
        return 0;
}

输出:

  

称为私人功能

虽然它没有使用boost,但基本的想法就是这样。

请注意,只有成员函数和friend才能创建指向private成员函数的指针。其他人无法创造它。

在ideone演示:http://ideone.com/14eUh