4

私は最近、プロジェクトで Boost.Asio の使用を開始しました。新しく作成されたソケットの所有権を tcp::acceptor::async_accept に転送するクリーンなソリューションを誰かが知っているかどうかを知りたいと思います。これにより、この所有権が受け入れに転送されます。ハンドラー関数。

ハンドラーは一度だけ呼び出される必要があるため、これは一貫性のない欲求ではありません。

std::bind() はそのパラメーターを CopyConstructible にする必要があるため、 std::bind() をパラメーターとして std::unique_ptr<> できないことに気付きました。それだけでなく、Boost の AcceptHandler の概念も CopyConstructible である必要があります。

したがって、私のオプションは次のようになります。

  • コピー コンストラクターを使用してオブジェクトを移動する非推奨の std::auto_ptr<> 方法を使用すると、Boost.Asio の新しいリリースであいまいなバグが発生する可能性があります。
  • std::shared_ptr<> を使用し、ポインターが不要になったら、つまり実際のハンドラー関数に到達したときに共有所有権をポインターから取り除く方法はありません (これは、http://wwwの例でジョブが行われる方法です)。私が読んだ限りでは.boost.org/doc/libs/1_43_0/doc/html/boost_asio/examples.html )。

また

  • あなたは私にとってより良い考えを持っています。

私はここでかなり途方に暮れています。誰でも私を啓発できますか?

4

1 に答える 1

1

c++0x 標準ライブラリを使用してこれを行う方法を見つけようとしましたが、できませんでした。最終的には、独自の rvalue_reference_wrapper と rvalue_ref() コンビニエンス クラスを作成することにしました。通常の std::bind と同様に、コピーできないオブジェクトをコピー可能なものでラップする必要があります (reference_wrapper が最適な例です)。ポインタを渡すこともできますが、それはインターフェイスを変更することを意味します。

これは私のマシンで機能しました:

#include <iostream>
#include <functional>
#include <memory>

template< class T >
struct rvalue_reference_wrapper
{
    rvalue_reference_wrapper( T&& t )
        : t_(std::move(t))
    {}

    operator T&&() const volatile
    {
        return std::move(t_);
    }

private:
    T&& t_; 
};

template< class T >
rvalue_reference_wrapper<T> rvalue_ref( T&& t )
{
    return rvalue_reference_wrapper<T>(std::move(t));
}

void go( std::unique_ptr<int> i )
{
    std::cout << *i << std::endl;
}

int main()
{
    std::unique_ptr<int> i(new int(1));

    auto b = std::bind( go, rvalue_ref(std::move(i)) );
    //auto b = std::bind( go, std::ref(std::move(i)) ); // Wont work

    b();
}

私はコードを防弾にはしていませんが、rvalue_reference_wrapper の必要性、または std::reference_wrapper を使用してそれをシミュレートする方法についての議論を歓迎します。

また、特定のケースでは、async を使用しているため、元の unique_ptr がスコープを離れる (そして破棄される) 可能性が高いため、右辺値参照ではなく値でオブジェクトを保持する rvalue_reference_wrapper の異なるバージョンを作成する必要がある可能性があります。アシオコール。

于 2011-03-03T19:48:29.843 に答える