5

私は C++ で右辺値参照を使用するのが初めてで、日常生活でそれらを使用する方法を学びたいと考えています。一般的なユースケースに関する 2 つの関連する質問があります。boost::in_place と boost::bind での右辺値参照の使用です。

  1. boost::in_place での右辺値参照の使用

コンストラクターが右辺値参照をパラメーターとして受け取るクラスを考えてみましょう。

struct A
    : boost::noncopyable 
{
    A(int&&){}
};

それでは、このクラスのブースト オプション変数を作成してみましょう。

void foo(int&& value)
{
    boost::optional<A> opt;
    // some code here 
    opt = boost::in_place(std::forward<int>(value)); //Error!
}

このような例で右辺値参照を渡す正しい方法は何ですか。右辺値参照用のboost::reference_wrapperのような解決策はありますか?

  1. 右辺値参照を使用してバインド ファンクターを関数オブジェクトに渡す

もう 1 つの一般的な使用例は、boost::bind ファンクター オブジェクトを boost::function オブジェクトに割り当てることです。

void foo(int&&)
{
}

void bar()
{
    boost::function<void(int&&)> func;

    int x = 0;
    func = boost::bind(foo, std::move(x)); // Compilation error (a)

    func = boost::bind(foo, _1); // Compilation error too (b)
}

命令 (a) は最初の呼び出し後に未定義の変数値につながる可能性があることを理解していますが、命令 (b) にはそのような問題さえありません。しかし、このコードを正しく記述する方法は?

4

1 に答える 1

0

boost in_places は、移動参照または右辺値参照をネイティブにサポートしていません。ただし、boost::in_place_factory_base を継承する新しいクラスを作成して、独自のクラスを作成することはできます。または、emplace 関数 (folly::Optional など) をサポートするオプションを使用することもできます。

推奨するかどうかはわかりませんが、ブーストで一般的なオーバーロードを作成して、次のように処理できます。

#include <boost/optional.hpp>      
#include <boost/utility/in_place_factory.hpp>
#include <folly/ApplyTuple.h>

namespace boost                                                                      
{                                                                                  
  template<class ... As> 
  struct rvalue_in_place : public in_place_factory_base 
  {
    mutable std::tuple<As...> tup_; 
    rvalue_in_place(As ... as)
      : tup_(std::forward<As>(as)...)
   {
   }                                                                                   
   template< class T >
   void apply ( void* address ) const 
   {
     auto make = [address](As ... as) { new (address) T(std::forward<As>(as)...);  }; 
     folly::applyTuple(make, tup_); 
   }
 };   
 template <class ... As> 
 rvalue_in_place<As&&...> in_place(As && ... a)
 {
   return rvalue_in_place<As&&...>(std::forward<As>(a)...);
 }
}
于 2013-03-29T18:39:36.173 に答える