如何重载static和dynamic_point_cast
How to overload static and dynamic_pointer_cast
我有一个像下面这样的智能指针类:
template <class T>
class Sptr {
template<typename U> friend class Sptr;
template <typename T1, typename T2>
friend bool operator==(const Sptr<T1> &a, const Sptr<T2> &b);
private:
T* obj;//pointer to current obj
RC* ref; //reference counter
std::function<void()> destroyData;
bool ok_;
public:
Sptr();
~Sptr();
template <typename U>
Sptr(U *);
Sptr(const Sptr &);
template <typename U>
Sptr(const Sptr<U> &);
template <typename U>
Sptr<T> &operator=(const Sptr<U> &);
Sptr<T> &operator=(const Sptr<T> &);
void reset();
T* operator->() const
{return obj;};
T& operator*() const
{return *obj;};
T* get() const
{return obj;};
explicit operator bool() const {
return ok_;
}
};
到现在为止一切都很好,我想写static_pointer_cast
和dynamic_pointer_cast
的函数。我不知道该如何继续下去。谁能给我指个正确的方向?下面是一个示例测试代码,我打算通过它来测试它。(c++11件事ok)
// Test static_pointer_cast.
{
Sptr<Derived> sp(new Derived);
Sptr<Base1> sp2(sp);
Sptr<Derived> sp3(static_pointer_cast<Derived>(sp2));
}
// Test dynamic_pointer_cast.
{
Sptr<Derived_polymorphic> sp(new Derived_polymorphic);
Sptr<Base_polymorphic> sp2(sp);
Sptr<Derived_polymorphic> sp3(dynamic_pointer_cast<Derived_polymorphic>(sp2));
Sptr<Derived_polymorphic> sp4(static_pointer_cast<Derived_polymorphic>(sp2));
Sptr<Derived2_polymorphic> sp5(dynamic_pointer_cast<Derived2_polymorphic>(sp2));
assert(!sp5);
}
两个类型转换都是模板(可能是友型),它们创建了一个不同类型的新Sptr
,并通过对底层指针的类型转换初始化,并根据需要增加引用计数。主要的复杂之处在于,您需要指向同一个完整对象的不同类型的多个指针,并且当最后一个指针(无论其类型是什么)超出作用域时,您需要管理使用正确指针调用deleter。
一种可能的方法是将删除指针和原始指针存储在引用计数对象中(顺便说一句,删除指针应该一直在那里,你只需要一个副本!)。每个Sptr都持有不同类型的原始指针,但是当它消失时,它会使用存储在引用计数中的指针。
相关文章:
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- C++类中的二维"dynamic"数组?
- Qt5 部署"procedure entry point could not be located"
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- 如何从内存中分配GDI+ POINT类地址?
- protobuf in C++ with dynamic binding for google::protobuf::M
- 如何在OpenCV中存储部分轮廓点喜欢新矢量中的左侧,该类型为<vector<vector<Point>>
- 在每个向量<向量中查找最小/最大 x,y<Point>>
- "Entry Point Not Found" Azure 中的错误 LightGBM R 包
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- 如何创建geometry_msgs :: point
- 为什么我会得到"floating point exception"
- Paraview:Live Point Cloud可视化插件
- "The ordinal 344 could not be located in the dynamic link library"
- Libavcodec "the procedure entry point for av_frame_alloc could not be located" Visual Studio 2017 C+
- 无法运行Qt C++发布版本。 'The procedure entry point could not be located'
- 没有用于初始化'point'的匹配构造函数
- 在win2k3上运行.exe时发生"The procedure entry point GetErrorMode could not be located in the dynamic link l