Независимо от того, что копирование unique_ptr
имеет смысл или нет *, я попытался реализовать этот класс, просто обернув std::unique_ptr
и столкнувшись с трудностями, где именно копируется, в случае умного указателя на базу и сохраненный объект является производным классом.Возможно ли реализовать copyable_unique_ptr, на который не повлияет нарезка?
Наивная реализация конструктора копии можно найти по всему Интернету (data
является завернутым std::unique_ptr
):
copyable_unique_ptr::copyable_unique_ptr(const copyable_unique_ptr& other)
: data(std::make_unique(*other.get()) // invoke the class's copy constructor
{}
Проблемы здесь в том, что из-за аргументы, оставшегося из шаблона, является то, что копия создает экземпляр типа T
, даже если реальный тип U : T
. Это приводит к потере информации о копии, и, хотя я прекрасно понимаю, почему это происходит здесь, я не могу найти способ обойти это.
Обратите внимание, что в случае перемещения нет проблем. Исходный указатель был правильно создан где-то в пользовательском коде, и перемещение его к новому владельцу не изменяет реальный тип объекта. Чтобы сделать копию, вам нужна дополнительная информация.
Также обратите внимание, что решение, использующее функцию clone
(таким образом, заражая интерфейс типа T
), не является тем, что я считаю приемлемым.
* если вы хотите, один указатель, владеющего к Copyable ресурса, это может иметь смысл, и это дает гораздо больше, чем то, что scoped_ptr
или auto_ptr
обеспечит.
вот так? https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern#Polymorphic_copy_construction – Hayt
@Hayt: прочитайте мое последнее предложение выше строки. – rubenvb
Я имею в виду, что вы вводите новый тип между 'T' и' U'. Таким образом, не заражать Т напрямую. – Hayt