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?我猜不是。
我在这里缺少什么?
答案 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