Вы не можете, так как это нарушит самое основное правило unique_ptr
: должен быть только один экземпляр, который содержит данный указатель, и unique_ptr
имеет полное право собственности на него (когда он выходит из сферы действия, удаляется).
unique_ptr<T>
и unique_ptr<U>
(где U : T
) несовместимы, как вы видели.
Для shared_ptr
, для которых вы можете иметь несколько экземпляров, есть std::static_pointer_cast
, который ведет себя так же, как static_cast
, за исключением того, что она принимает shared_ptr
и возвращает другой (и оба указывают на тот же объект).
Если вам абсолютно необходимо использовать unique_ptr
, вам необходимо создать функцию, которая сначала отключит ваш текущий unique_ptr
и помещает этот указатель в новый подходящий тип. Вам также может потребоваться сделать обратное преобразование после вызова функции.
ли 'Foo' полиморфный экземпляр? – Mahesh
Выполняйте любые функции, которые не связаны с тем, откуда взялась память или что происходит потом, возьмите параметры по ссылке (или необработанный указатель, если он может быть нулевым). –
@NeilKirk: Эта работа для функции, но это разумный прецедент для хранения 'unique_ptr ' в коллекции. И если функция должна его хранить ... –