Как я могу использовать лямбда-функцию внутри себя?

У меня есть этот код и не знаю, возможно ли то, что я хотел бы достичь.

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

Как только сокет принят, я хотел бы повторно использовать обработчик (он же лямбда-функция). Это возможно? Есть ли лучший способ сделать это?

Ответ 1

Вам нужно сохранить копию лямбда сама по себе, используя std::function<> (или нечто подобное) в качестве посредника:

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

Но вы можете делать это только по ссылке; если вы попытаетесь захватить его по значению, это не сработает. Это означает, что вам нужно ограничить использование таких лямбда для использования, потому что захват по ссылке имеет смысл. Поэтому, если вы оставите эту область до того, как ваша асинхронная функция будет завершена, она сломается.

Другая альтернатива - создать правильный функтор, а не лямбда. В конечном счете, лямбда не может все.