11

我有这段代码,不知道我想要实现的目标是否可行。

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

一旦接受了套接字,我想重用处理程序(又名 lambda 函数)。这可能吗?有没有更好的方法来实现这一点?

4

1 回答 1

9

std::function<>您必须使用(或类似的东西)作为中介来存储 lambda 的副本:

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

但你只能通过参考来做;如果你试图通过价值来捕捉它,它是行不通的。这意味着您必须将此类 lambda 的使用限制为使用按引用捕获才有意义。因此,如果您在异步函数完成之前离开此范围,它将中断。

您的另一种选择是创建一个适当的仿函数而不是 lambda。最终,lambdas 不能做所有事情。

于 2012-04-08T19:35:17.657 回答