2012-04-08 17 views
11

Tengo este código y no sé si lo que me gustaría lograr es posible.¿Cómo puedo usar la función lambda dentro de sí misma?

_acceptor.async_accept(
    _connections.back()->socket(), 
    [this](const boost::system::error_code& ec) 
    { 
     _connections.push_back(std::make_shared<TcpConnection>(_acceptor.get_io_service())); 
     _acceptor.async_accept(_connections.back()->socket(), this_lambda_function); 
    } 
); 

Una vez que se acepta un enchufe, me gustaría volver a utilizar el controlador (también conocido como la función lambda). es posible? ¿Hay una mejor manera de lograr esto?

+0

+1 Pregunta muy interesante. No había pensado en eso antes. – templatetypedef

+1

https://groups.google.com/group/comp.lang.c++moderated/browse_thread/thread/f1b3569c8aac0660?pli=1 – Anonymous

+0

No relacionado con su pregunta, pero debe saber que los guiones bajos principales (y dos guiones bajos adyacentes) están reservados y no deben usarse para identificadores de aplicaciones. – Marc

Respuesta

9

usted tiene que almacenar una copia de la lambda en sí mismo, utilizando std::function<> (o algo similar) como intermediario:

std::function<void(const boost::system::error_code&)> func; 
func = [&func, this](const boost::system::error_code& ec) 
{ 
    _connections.push_back(std::make_shared<TcpConnection>(_acceptor.get_io_service())); 
    _acceptor.async_accept(_connections.back()->socket(), func); 
} 

_acceptor.async_accept(_connections.back()->socket(), func); 

pero sólo puede hacerlo por referencia; si intenta capturarlo por valor, no funcionará. Esto significa que debe limitar el uso de dicho lambda a los usos donde capturar-por-referencia tendrá sentido. Entonces, si abandonas este alcance antes de que tu función asíncrono haya terminado, se romperá.

Su otra alternativa es crear un functor adecuado en lugar de un lambda. En definitiva, lambdas no puede hacer todo.

+0

¿No podemos usar 'auto'? – balki

+0

@balki: No. Es legal en C/C++ inicializar una variable con una expresión que usa el nombre de la variable. Sin embargo, esto se apaga cuando se trata de variables 'auto' ya que el nombre de la variable no tiene un tipo hasta que se pueda determinar el tipo de la expresión. –

Cuestiones relacionadas