«Даункинг»: от unique_ptr <Base> до unique_ptr <Derived>
У меня есть ряд заводов, которые возвращаютunique_ptr
, Тем не менее, под капотом они предоставляют указатели на различные производные типы, т.е.unique_ptr
unique_ptr
unique_ptr
и т.п.
ДаноDerivedA : Derived
а такжеDerived : Base
мы'иметь:
unique_ptr DerivedAFactory() {
return unique_ptr(new DerivedA);
}
Что мне нужно сделать, это "бросать" указатель из возвращенногоunique_ptr
до некоторого производного уровня (не обязательно исходного внутреннего). Для иллюстрации в псевдокоде: I '
unique_ptr ptr = static_cast(DerivedAFactory());
Я думаю сделать это, выпуская объект изunique_ptr
затем с помощью функции, которая преобразует необработанный указатель и переназначает его другомуunique_ptr
желаемого аромата (release
будет явно сделано вызывающим абонентом до вызова):
unique_ptr CastToDerived(Base* obj) {
return unique_ptr(static_cast(obj));
}
Это действительно так, или что-то происходит?
PS. Есть дополнительное осложнение в том, что некоторые фабрики находятся в DLL, которые динамически загружаются во время выполнения, а это значит, что мне нужно убедиться, что созданные объекты уничтожаются в том же контексте (пространстве кучи), в котором они были созданы. Передача права собственности (что обычно происходит в другом контексте) должна затем обеспечить удаление из исходного контекста. Но помимо необходимости предоставлять / приводить удалитель вместе с указателем, проблема приведения должна быть такой же.