次のようなライブラリから提供されるクラスがあります。
template <typename T>
class TypedClass
{
public:
typedef typename boost::shared_ptr<TypedClass<T> > Ptr;
T m_data;
T* m_pointer_data;
};
この特定のアーキテクチャで int と float が常に同じサイズ (およびアラインメント) であることを喜んで受け入れると仮定すると、これは私には有効に思えます。
TypedClass<int>* int_object = new TypedClass<int>();
TypedClass<float>* float_object = reinterpret_cast<TypedClass<float>* >(int_object);
今、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));
これは問題なく動作するように見えますが、共有ポインタをこのように使用すると、オブジェクトが 2 回削除されるので、避けたいと思います。
「TypedClass」はサードパーティ ライブラリの一部であり、このライブラリはすべての内部機能に共有ポインタを使用するため、この形式のデータが必要であることに注意してください。私は以前にこの問題を boost enable_shared_from_this から継承して解決しましたが、ここでは不可能です。
これは、新しい型で新しいオブジェクトを割り当てることなく、同じサイズのデータ型に対して同じオブジェクトを再利用しようとする単純な手法です。
提案を歓迎します。