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

Gab*_*iel 19 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();
}
Run Code Online (Sandbox Code Playgroud)

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

我在这里错过了什么?

Mik*_*our 37

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

  • 对于私有静态方法的常规指针也是如此. (9认同)

Naw*_*waz 8

它通过指向成员函数的指针,调用私有函数.类的成员函数创建指针,并将其传递给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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

叫做私人功能

虽然它不使用boost,但基本思路正是这样.

请注意,只有成员函数并且friend可以创建指向private成员函数的指针.其他人无法创造它.

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