2011-06-30 21 views
18

boost :: bind es extremadamente útil en una serie de situaciones. Una de ellas es enviar/publicar una llamada de método para que io_service realice la llamada más adelante, cuando sea posible.¿Cómo se pueden impulsar :: métodos privados de llamada de enlace?

En tales situaciones, boost :: bind se comporta como uno podría esperar que cándidamente:

#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(); 
} 

Sin embargo, por lo que yo sé impulso crea un functor (una clase con un operador()()) capaz de llama al método dado en el objeto dado. ¿Debería esa clase tener acceso a la B privada? Supongo que no.

¿Qué me falta aquí?

Respuesta

35

Puede llamar a cualquier función miembro a través de una función de puntero a miembro, independientemente de su accesibilidad. Si la función es privada, solo los miembros y amigos pueden crear un puntero a ella, pero cualquier cosa puede usar el puntero una vez creada.

+8

Lo mismo es cierto para los punteros regulares a métodos estáticos privados. – MSalters

7

Su función de puntero a miembro, impulsa las llamadas a funciones privadas. Una función miembro de la clase crea el puntero y lo pasa para impulsar, y más tarde, boost utiliza ese puntero para llamar a la función privada en un objeto de la clase.

Aquí es una simple ilustración de esta idea básica:

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; 
} 

Salida:

llamada función privada

A pesar de que no utiliza impulso, pero la idea básica es exactamente esto

Tenga en cuenta que solo las funciones de miembro y friend pueden crear un puntero a la función de miembro private. Otros no pueden crearlo.

demo en Ideone: http://ideone.com/14eUh

+0

¡Gracias por la muestra del código! – Gabriel

Cuestiones relacionadas