使用共享指针在两个类型模板化的类之间进行转换

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继承的问题,但这不可能.

这是一种简单的技术,尝试将相同的对象重用于具有相同大小的数据类型,而无需使用新类型分配新对象.

建议欢迎.

sba*_*bbi 5

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)