如何实现一些智能指针的深度复制特性
How to implement deep copy feature in some smart pointer?
unique_ptr非常有用。然而,它是不可复制的。如果为它的指向类提供虚拟克隆(深度复制)方法,我认为它将变得更有用。是否有必要或有更好的方法来实现它?在某些库中是否存在类似的智能指针?这是一个版本
template<class T>
class deep_ptr: private unique_ptr<T>
{
public:
using unique_ptr<T>::operator *;
using unique_ptr<T>::operator ->;
using unique_ptr<T>::operator bool;
using unique_ptr<T>::release;
using unique_ptr<T>::reset;
using unique_ptr<T>::get;
// add (DEFAULT_CONSTRUCTOR)(MOVE_CONSTRUCTOR)(MOVE_ASSIGNMENT_METHOD) ...
explicit deep_ptr(T* p) : unique_ptr(p) {}
deep_ptr(deep_ptr const& r) : unique_ptr(r->clone()) {}
deep_ptr& operator=(deep_ptrconst& r)
{ if (this != &r) reset(r->clone()); return *this; }
};
只是觉得很有用,但从来没有见过类似的东西。???
除非我误解了你在寻找什么,如果一个类有一个克隆方法,那应该足以得到你正在寻找的。
示例代码:
#include <iostream>
#include <memory>
struct A
{
virtual ~A() {}
virtual A* clone() = 0;
};
struct B : A
{
B(int in = 0) : x(in) {}
B(B const& copy) : x(copy.x) {}
virtual ~B() {std::cout << "In B::~B()n";}
virtual A* clone() { return new B(*this); }
int x;
};
int main()
{
std::unique_ptr<A> p1(new B(10));
std::unique_ptr<A> p2(p1->clone());
return 0;
}
运行上述程序的输出:
<>之前B:: ~ B ()B:: ~ B ()如果没有克隆方法(只是一个复制构造函数),以下操作应该可以工作:
template <typename T>
class deep_ptr
{
public:
deep_ptr() : i_() {}
deep_ptr(std::nullptr_t) : i_(nullptr) {}
template <typename U>
deep_ptr(U* u) : i_(u ? new inner_impl<U>(*u) : nullptr) {}
~deep_ptr() { delete i_; }
deep_ptr(const deep_ptr& p) : i_(p.i_ ? p.i_->copy() : nullptr) {}
deep_ptr& operator=(const deep_ptr& p)
{
if (!p.i_) { i_ = nullptr; }
else { i_ = p.i_->copy(); }
}
deep_ptr(deep_ptr&& p) : i_(p.i_) { p.i_ = nullptr; }
deep_ptr& operator=(deep_ptr&& p)
{
i_ = p.i_;
p.i_ = nullptr;
}
const T* operator->() const { return get(); }
const T* get() const
{
if (i_) { return *i_; }
return nullptr;
}
const T& operator*() const { return *static_cast<T*>(*i_); }
T* operator->() { return get(); }
T* get()
{
if (i_) { return *i_; }
return nullptr;
}
T& operator*(){ return *static_cast<T*>(*i_); }
private:
struct inner
{
virtual inner* copy() const = 0;
virtual operator const T*() const = 0;
virtual operator T*() = 0;
virtual ~inner() {}
};
inner* i_;
template <typename U>
struct inner_impl : inner
{
inner_impl(const U& u) : u_(u) {}
inner_impl* copy() const override { return new inner_impl(u_); }
operator const T*() const override { return &u_; }
operator T*() override { return &u_; }
U u_;
};
};
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- C++尝试深度复制唯一指针时出现内存访问冲突
- 如何深度复制链表对象指针
- 是否可以在不显式迭代每个元素的情况下深度复制指针容器?
- 有没有一种 stl 方法来执行指针向量的深度复制
- Qt:通过深度复制访问列表中的数据结构是否应该比通过指针访问它慢得多
- 使用OpenCV中的指针检索深度
- 实现指针元组的深度复制
- 通过在CGAL中传递高度、宽度、深度和数据指针来创建Image_3实例
- c++深度复制指针到带有指针值的映射
- 指向指向对象的指针数组的指针的深度拷贝
- 如何实现一些智能指针的深度复制特性
- 从指向结构体的空指针到另一个变量的深度复制