3

私はいくつかのSTLコンテナタイプを持っていますT、例えばtemplate< typename F > using T = std::vector< F >;。次のコードを記述できるようにしたいと思います。

typedef std::string F;
T< F > v(2, "a"), w(3, "b");
v += std::move(w);
std::cout << "v : ";
std::copy(std::begin(v), std::end(v), std::ostream_iterator< F >(std::cout, "|"));
std::cout << std::endl << "w : ";
std::copy(std::begin(w), std::end(w), std::ostream_iterator< F >(std::cout, "|"));
std::cout << std::endl;

そして出力を取得します:

v : a|a|b|b|b|
w : |||

つまり、「-ing」を使用して(1つずつまたは範囲ごとに)ソースのすべてのコンテンツをw宛先の最後に追加できるようにし、ソースのすべての要素が空のままになり、電話するだけです。vstd::move<utility><algorithm>w.clear();

演算子に右辺値参照を認識させることは可能ですか?言う:

T & ::operator += (T &, T &&);

それとも私が欲しいものが他にありますか?

4

1 に答える 1

4

はい、それは機能しTますが、タイプではないため、そのような演算子を書くことはできません。Tはテンプレートなので、演算子は次のようなものである必要があります

template<typename U>
  T<U>& operator+=(T<U>&, T<U>&&);

可能な実装は次のとおりです。

template<typename U>
  T<U>& operator+=(T<U>& lhs, T<U>&& rvalue)
  {
    std::move(rvalue.begin(), rvalue.end(), std::back_inserter(lhs));
    rvalue.clear();
    return lhs;
  }

そして、左辺値に対してオーバーロードされます:

template<typename U>
  T<U>& operator+=(T<U>& lhs, const T<U>& lvalue)
  {
    std::copy(lvalue.begin(), lvalue.end(), std::back_inserter(lhs));
    return lhs;
  }

これを任意のタイプで機能させるには(これは悪い考えだと思いますが、必要なタイプにのみ一致するように制約する必要があります)、これを試してください。

template< class T, class U >
  inline
  typename std::enable_if< std::is_lvalue_reference< U >::value, T& >::type
  operator += (T& lhs, U&& lvalue)
  { /* copy from lvalue */ }

template< class T, class U >
  inline
  typename std::enable_if< !std::is_lvalue_reference< U >::value, T& >::type
  operator += (T& lhs, U&& rvalue)
  { /* move from rvalue */ }
于 2013-02-08T10:23:58.033 に答える