Ответ 1
Вы можете вызвать любую функцию-член через функцию-указатель-член, независимо от ее доступности. Если функция является частной, то только члены и друзья могут создавать указатель на нее, но все может использовать указатель после создания.
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 создает функтор (класс с operator()()), способный вызвать данный метод на данном объекте. Должен ли этот класс иметь доступ к частному B? Наверное, нет.
Что мне здесь не хватает?
Вы можете вызвать любую функцию-член через функцию-указатель-член, независимо от ее доступности. Если функция является частной, то только члены и друзья могут создавать указатель на нее, но все может использовать указатель после создания.
Своя сквозная функция-указатель-член, увеличивает вызовы частных функций. Функция-член класса создает указатель и передает его для повышения, а затем 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
. Другие не могут его создать.
Демо на идеоне: http://ideone.com/14eUh