«Даункинг»: от unique_ptr <Base> до unique_ptr <Derived>

У меня есть ряд заводов, которые возвращаютunique_ptr, Тем не менее, под капотом они предоставляют указатели на различные производные типы, т.е.unique_ptrunique_ptrunique_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, которые динамически загружаются во время выполнения, а это значит, что мне нужно убедиться, что созданные объекты уничтожаются в том же контексте (пространстве кучи), в котором они были созданы. Передача права собственности (что обычно происходит в другом контексте) должна затем обеспечить удаление из исходного контекста. Но помимо необходимости предоставлять / приводить удалитель вместе с указателем, проблема приведения должна быть такой же.

Ответы на вопрос(1)

Ваш ответ на вопрос