Non è possibile, perché violerebbe la unique_ptr
regola più semplice: deve esserci una sola istanza che contiene un dato puntatore, e il unique_ptr
ha piena proprietà di esso (quando va fuori portata, il pointee è cancellato).
unique_ptr<T>
e unique_ptr<U>
(dove U : T
) non sono compatibili, come hai visto.
Per shared_ptr
, per il quale è possibile avere più istanze, c'è std::static_pointer_cast
che si comporta proprio come un static_cast
, tranne che accetta un shared_ptr
e restituisce un altro (ed entrambi puntano allo stesso oggetto).
Se è assolutamente necessario utilizzare uno unique_ptr
, sarà necessario creare una funzione che prima rinnega l'attuale unique_ptr
e lo inserisce in uno nuovo del tipo corretto. Potrebbe anche essere necessario eseguire la conversione opposta dopo la chiamata di funzione.
è 'foo' un'istanza polimorfica? – Mahesh
Esegui qualsiasi funzione che non si interessa da dove proviene la memoria o che cosa succede dopo, prendi i parametri per riferimento (o puntatore raw se può essere nullo). –
@NeilKirk: funziona per la funzione, ma è un caso d'uso ragionevole per memorizzare 'unique_ptr ' in una raccolta. E se la funzione deve memorizzarlo ... –