0

次のクラスについて考えてみます。

template <typename Type>
class Wrapper
{
    public:
        Wrapper(const Type& x) : _data(x) {;}
        Wrapper<Type>& operator=(const Type& x) {_data = x; return *this;}
    protected:
        Type _data;
};

このクラスのムーブコンストラクターWrapper(Type&& x)とムーブ代入演算子の定義は何でしょうか?operator=(Type&& x)

4

2 に答える 2

2
Wrapper(Type&& x) : _data(std::move(x)) {}
Wrapper& operator=(Type&& x) {_data = std::move(x); return *this;}
于 2013-01-26T14:48:47.907 に答える
0

これをC++11で書く興味深い方法は次のとおりです。

template<typename A, typename B, typename T=void*>
using IfSameBaseType = std::enable_if<
  typename std::is_same<
    typename std::remove_cv<A>::type,
    typename std::remove_cv<B>::type
  >::type,
  T
>::type;

template <typename T>
class Wrapper
{
  public:
    template<typename U, typename unused>
    Wrapper(U&& u, unused* do_not_use=(IfSameBaseType<T,U>*)nullptr) :
      data_( std::forward(u) )
    {}
    template<typename U>
    IfSameBaseType<T,U,Wrapper<Type>>& operator=(U&& x) {
      data_ = std::forward(x);
      return *this;
    }
  protected:
    T data_;
};

ここで&&は、型推論コンテキストで使用して、l値とr値の参照に単一のオーバーライドを提供し、それを。を介して渡しstd::forwardます。このIsSameBaseTypeようなことで、型のコンストラクターのみを記述できるようになります。これを拡張して、それほど面倒なことをせずTに、「暗黙的にTに変換可能」と言うことができます。IsSameBaseType

これの利点は、重複するメソッドが少ないことです。不利な点は、テンプレートの不正行為がすべての点から誰かの気を散らす可能性があることです。

于 2013-01-26T15:06:30.203 に答える