かんすーのもどりち

// std名前空間内に以下が定義されていると仮定
namespace std{

template<class T>
struct move_traits
{
  typedef typename T::move_type move_type;
  static move_type move(T &x){ return x.move(); }
};

template<class T>
typename move_traits<T>::move_type move(T &x)
{ return move_traits<T>::move(x); }

}

// ---------- 以下ライブラリコード ----------
template<class T>
class movable_vector
{
public:
  /*...*/

  struct move_type
  { movable_vector mv; };

  movable_vector(move_type x)
    : buf(0), sz(0)
  { std::swap(*this, x.mv); }

  move_type move()
  {
    move_type tmp;
    std::swap(*this, tmp.mv);
    return tmp;
  }

private:
  move_ptr<T[]> buf;
  std::size_t sz;
};

//---------- 以上ライブラリコード ----------
//---------- 以下クライアントコード ----------

movable_vector<int>::move_type f()
{
  movable_vector<int> tmp(1000000);
  /*...*/
  return std::move(tmp);
}

int main()
{
  movable_vector<int> v = f();
  /*...*/
  return 0;
}

( ゜∀゜)アハハ八八ノヽノヽノヽノ \ / \/ \