Il tuo suggerimento (chiamare il costruttore shared_ptr<T>
senza argomenti) è corretto. (Chiamare il costruttore con il valore 0 è equivalente.) Non penso che sarebbe più lento di chiamare vec.push_back()
con un valore preesistente shared_ptr<T>
, poiché la costruzione è necessaria in entrambi i casi (costruzione diretta o copia-costruzione).
Ma se si vuole sintassi "più bello", si potrebbe provare il seguente codice:
class {
public:
template<typename T>
operator shared_ptr<T>() { return shared_ptr<T>(); }
} nullPtr;
Questo dichiara un singolo oggetto globale nullPtr
, che consente la seguente sintassi naturale:
shared_ptr<int> pi(new int(42));
shared_ptr<SomeArbitraryType> psat(new SomeArbitraryType("foonly"));
...
pi = nullPtr;
psat = nullPtr;
Nota che se lo si utilizza in più unità di traduzione (file di origine), è necessario assegnare un nome alla classe (ad esempio _shared_null_ptr_type
), spostare la definizione dell'oggetto nullPtr
in un file .cpp separato e aggiungere le dichiarazioni extern
in t lui file di intestazione in cui è definita la classe.
fonte
2009-03-07 04:31:33
buone notizie dallo standard della prossima C++: lì, si può scrivere "vec.emplace_back();" e ottieni un puntatore nullo append :) –
Considera l'uso di 'boost :: ptr_vector' che richiede meno overhead. – Philipp