Su sugerencia (llamar al constructor shared_ptr<T>
sin ningún argumento) es correcta. (Llamar al constructor con el valor 0 es equivalente.) No creo que esto sea más lento que llamar al vec.push_back()
con un shared_ptr<T>
preexistente, ya que se requiere una construcción en ambos casos (construcción directa o construcción de copia).
Pero si quieres sintaxis "mejor", puede probar con el siguiente código:
class {
public:
template<typename T>
operator shared_ptr<T>() { return shared_ptr<T>(); }
} nullPtr;
Esto declara un único objeto global nullPtr
, que permite la siguiente sintaxis natural:
shared_ptr<int> pi(new int(42));
shared_ptr<SomeArbitraryType> psat(new SomeArbitraryType("foonly"));
...
pi = nullPtr;
psat = nullPtr;
Nota que si usa esto en varias unidades de traducción (archivos fuente), tendrá que dar un nombre a la clase (por ejemplo, _shared_null_ptr_type
), mover la definición del objeto nullPtr
a un archivo .cpp separado y agregar declaraciones extern
en t el archivo de encabezado donde se define la clase.
buenas noticias de la siguiente norma C++: no, puede escribir "vec.emplace_back();" y añada un apuntador nulo :) –
Considere usar 'boost :: ptr_vector' que requiere menos sobrecarga. – Philipp