2009-11-22 13 views
6

Estoy repasando los ejemplos de boost :: asio. Estoy buscando en Example 4Boost :: asio async_wait handler signature

Lo que es confuso es que, la WaitHandler en este ejemplo tiene la firma

impresión de vacío (este)

Pero la llamada async_wait espera un controlador cuya

función firma del controlador debe ser:

void handler ( const boost :: system :: error_code & error // Resultado de la operación. );

Source: Boost documentation

Dado que el tipo de parámetro es parte de la firma de una función, por lo que en el ejemplo anterior, async_wait acepta un manejador cuyo parámetro no es de tipo impulso :: Sistema :: código_error?

THanks.

Respuesta

11

Como observa correctamente, el método async_wait acepta una función de controlador que toma un parámetro (const boost :: system :: error_code &). Pero en el ejemplo Timer.4, la llamada a async_wait se pasa a través de impulso se unen como sigue:

timer_.async_wait(boost::bind(&printer::print, this)); 

El impulso :: bind devuelve un objeto de función que se refiere a método impresión para la clase impresora para la objeto al que hace referencia el este. El método async_wait llama a este objeto de función con el parámetro de error (ya que esa es la firma que espera). Pero el parámetro de error se ignora silenciosamente porque no está referenciado por el enlace.

El boost::bind documentation oficial proporciona más detalles sobre boost :: bind. Ver también el artículo How the Boost Bind Library Can Improve Your C++ Programs (probablemente hay muchos más artículos disponibles, pero encontré este muy útil).

2

En la llamada se especifica en async_wait qué parámetros toma la función de devolución de llamada, utilizando marcadores de posición. Verifique la oración justo encima de la llamada async_wait en la página a la que vinculó:

Observará que el marcador de posición boost :: asio :: placeholders :: error no se especifica aquí, ya que la función miembro de impresión no acepta un error objeto como un parámetro.

Busque "placeholder" en this example y verá cómo hacerlo.

Cuestiones relacionadas