考虑以下课程:
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)
的定义是什么?
答案 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可能会分散某人的注意力。