【问题标题】:How can I use lambda function within itself?如何在其内部使用 lambda 函数?
【发布时间】:2012-04-09 03:35:17
【问题描述】:

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

_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 函数)。这可能吗?有没有更好的方法来做到这一点?

【问题讨论】:

标签: c++ c++11 lambda


【解决方案1】:

您必须使用 std::function&lt;&gt;(或类似的东西)作为中介来存储 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。最终,lambda 不能做所有事情。

【讨论】:

  • @balki:不。在 C/C++ 中,使用使用变量名的表达式初始化变量是合法的。但是,在处理 auto 变量时,它会被关闭,因为在可以确定表达式的类型之前,变量名没有类型。
猜你喜欢
  • 1970-01-01
  • 2021-03-25
  • 2017-04-28
  • 2019-11-23
  • 2016-07-11
  • 2020-09-12
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
相关资源
最近更新 更多