移动值/对象包装器的构造函数?

时间:2013-01-26 14:43:22

标签: c++ c++11 constructor assignment-operator move-semantics

考虑以下课程:

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)的定义是什么?

2 个答案:

答案 0 :(得分:2)

Wrapper(Type&& x) : _data(std::move(x)) {}
Wrapper& operator=(Type&& x) {_data = std::move(x); return *this;}

答案 1 :(得分: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而没有那么多麻烦

这样做的好处是我们有更少的重复方法。缺点是模板tomfoolery可能会分散某人的注意力。