Я реализую шаблон shared_pointer, который содержит указатель на имя типа T Я хочу реализовать конструктор-копию (с указателем базового класса (T)), который получает общий класс указателя (который содержит указатель на класс Derived (O)). Как я могу отправить полученный указатель на shared_ptr из базового типа?cast from templated производный класс к базовому классу шаблона
template <typename T>
class Shared_Ptr
{
public:
template <typename O>friend class Shared_Ptr;
template <typename O>
Shared_Ptr(const Shared_Ptr<O>& other_);
private:
struct PtrVal
{
PtrVal(T* ptr);
~PtrVal();
T *m_ptr;
size_t m_count;
};
PtrVal *m_val;
};
Как я могу реализовать Copy-Constructor ??
template <typename T>
template <typename O>
Shared_Ptr<T>::Shared_Ptr(const Shared_Ptr<O>& other_):
m_val(static_cast<const Shared_Ptr<T> >(other_).m_val)
{}
Это скомпилирует, но дает ошибку сегментации (сброс ядра) во время выполнения.
Я нашел другое решение, но это действительно некрасиво: преобразовать m_ptr из other_ Т * (вместо O *), а затем бросили m_val О к m_val Т
Shared_Ptr<T>::Shared_Ptr(const Shared_Ptr<O>& other_)
{
if(dynamic_cast<T *>(other_.m_val->m_ptr))
{}
m_val = (Shared_Ptr<T>::PtrVal *)other_.m_val;
}
Любые предложения к чему-то лучше? Спасибо
смотрите в исходном коде для boost :: shared_ptr и std :: shared_ptr. Вы увидите, что дебетер также сохраняется в блоке управления (что важно для стирания стирания). –
Вы должны быть более точными с терминологией, то, что вы называете копией, не является одним. – Slava