是否存在类字段的通用包装器,在复制时(初始化和赋值)使用默认构造函数(或其他构造函数)而不是实际复制数据?
一个(非满意的)解决方案:
在包含类中实现了复制构造函数:
class Containing {
public:
Containing(const Containing &other) : o1(), o2(other.o2) {};
private:
Object o1;
OtherObject o2;
};
缺点: 我必须明确定义副本c' tor。
第二(非满意)解决方案:
与std::unique_ptr
类似,我可以实现一个指针,在复制时只使用默认构造函数。例如:
template<typename T>
class copyable_unique_ptr {
public:
copyable_unique_ptr(const copyable_unique_ptr<T> &other) : p = make_shared<T>() {}
private:
std::unique_ptr<T> p;
};
缺点: 在不必要的情况下使用动态分配的内存。
第三种解决方案(通过评论建议):
与第二种解决方案相同,但不使用指针和动态内存:
template<typename T>
class defaultly_copyable_wrapper {
public:
defaultly_copyable_wrapper(T &o) : o(o) {}
defaultly_copyable_wrapper(const defaultly_copyable_wrapper<T> &other) : o() {}
private:
T o;
};
到目前为止,这看起来是最佳解决方案。
是否有更好的解决方案(或标准化的第三种解决方案)?那不是常见的用例吗?