如何在Lambda函数内部使用Lambda函数?

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

一旦一个Socket被接受,我想重用处理程序(也就是Lambda函数)。这可行吗?有更好的方法可以实现吗?


非常有趣的问题。我之前从未想过这个。 - templatetypedef
1
https://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/f1b3569c8aac0660?pli=1 - Anonymous
与您的问题无关,但您应该知道前导下划线(以及两个相邻的下划线)是保留的,不应用于应用程序标识符。 - Marc
1个回答

9

您需要将lambda表达式的一个副本存储在自身中,使用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);

但是你只能通过引用来实现;如果你尝试通过值来捕获,它就不起作用。这意味着你必须限制这样一个lambda的使用,只有当按引用捕获才有意义。所以如果在异步函数完成之前离开此范围,它会中断。
你的另一个选择是创建一个适当的函数对象而不是lambda表达式。最终,lambda表达式无法完成所有任务。

@balki:不是的。在C/C++中,使用变量名初始化变量的表达式是合法的。然而,在处理“auto”变量时,这个功能被关闭了,因为变量名直到确定表达式的类型之前没有类型。 - Nicol Bolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接