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

ソケットが受け入れられたら、ハンドラー(別名ラムダ関数)を再利用したいと思います。これは可能ですか?これを達成するためのより良い方法はありますか?

4

1 に答える 1

9

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

しかし、あなたは参照によってのみそれを行うことができます; 値でキャプチャしようとすると、機能しません。これは、そのようなラムダの使用を、参照によるキャプチャが理にかなっている使用に制限する必要があることを意味します。したがって、非同期機能が終了する前にこのスコープを離れると、スコープが壊れます。

もう1つの方法は、ラムダではなく適切なファンクターを作成することです。最終的に、ラムダはすべてを実行できるわけではありません。

于 2012-04-08T19:35:17.657 に答える