Dan*_*Dan 2 c++ casting smart-pointers type-conversion reinterpret-cast
我有一个像这样的库提供的课程:
template <typename T>
class TypedClass
{
public:
typedef typename boost::shared_ptr<TypedClass<T> > Ptr;
T m_data;
T* m_pointer_data;
};
Run Code Online (Sandbox Code Playgroud)
假设我愿意接受int和float在这个特定体系结构上总是相同的大小(和对齐),这似乎对我有用:
TypedClass<int>* int_object = new TypedClass<int>();
TypedClass<float>* float_object = reinterpret_cast<TypedClass<float>* >(int_object);
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试使用boost shared_ptrs来实现相同的功能,并提出了这个:
TypedClass<int>::Ptr int_object = TypedClass<int>::Ptr(new TypedClass<int>());
void* int_object_void_pointer = reinterpret_cast<void*>(int_object.get());
TypedClass<float>::Ptr float_object(reinterpret_cast<TypedClass<float>*>(int_object_void_pointer));
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,但这种共享指针的使用将导致对象被删除两次,我想避免.
需要注意的是,'TypedClass'是第三方库的一部分,并且该库使用共享指针来实现其所有内部功能,因此我需要这种形式的数据.我之前已经解决了从boost enable_shared_from_this继承的问题,但这不可能.
这是一种简单的技术,尝试将相同的对象重用于具有相同大小的数据类型,而无需使用新类型分配新对象.
建议欢迎.
shared_ptr<T> 有一个有趣的重载构造函数:
template<class Y> shared_ptr(shared_ptr<Y> const & r, element_type * p);
Run Code Online (Sandbox Code Playgroud)
基本上这构造了一个shared_ptr,它接受删除和引用计数r,但它保持不变p.
你可以像这样使用它:
TypedClass<int>::Ptr int_object = TypedClass<int>::Ptr(new TypedClass<int>());
TypedClass<float>::Ptr float_object(int_object,reinterpret_cast<TypedClass<float>*>(int_object.get()));
Run Code Online (Sandbox Code Playgroud)
编辑:
如果你使用Boost> = 1.53.0,那么也有boost::reinterpret_pointer_cast.所以你可以写:
TypedClass<float>::Ptr float_object = boost::reinterpret_pointer_cast<TypedClass<float> >(int_object);
Run Code Online (Sandbox Code Playgroud)