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
无论其可访问性如何,您都可以通过指向成员的函数调用任何成员函数.如果该函数是私有的,那么只有成员和朋友可以创建指向它的指针,但任何东西都可以在创建后使用指针.
它通过指向成员函数的指针,调用私有函数.类的成员函数创建指针,并将其传递给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
归档时间: |
|
查看次数: |
4644 次 |
最近记录: |