Twoja sugestia (wywołanie konstruktora shared_ptr<T>
bez argumentów) jest poprawna. (Wywołanie konstruktora o wartości 0 jest równoważne.) Nie sądzę, że byłoby to wolniejsze niż wywoływanie vec.push_back()
z wcześniej istniejącym shared_ptr<T>
, ponieważ konstrukcja jest wymagana w obu przypadkach (albo bezpośrednia konstrukcja, albo kopia).
Ale jeśli chcesz „ładniejszy” składni, można spróbować następujący kod:
class {
public:
template<typename T>
operator shared_ptr<T>() { return shared_ptr<T>(); }
} nullPtr;
Ten deklaruje jeden globalny obiekt nullPtr
, który umożliwia następujące naturalną składnię:
shared_ptr<int> pi(new int(42));
shared_ptr<SomeArbitraryType> psat(new SomeArbitraryType("foonly"));
...
pi = nullPtr;
psat = nullPtr;
Note jeśli użyjesz tego w wielu jednostkach tłumaczeniowych (plikach źródłowych), będziesz musiał nadać klasie nazwę (np. _shared_null_ptr_type
), przenieść definicję obiektu nullPtr
do oddzielnego pliku .cpp i dodać deklaracje extern
wt he plik nagłówkowy, w którym zdefiniowana jest klasa.
dobrą wiadomością od standardu przyszłorocznego C++: nie można napisać "vec.emplace_back();" i uzyskaj wskaźnik zerowy dopisz :) –
Rozważ użycie 'boost :: ptr_vector', który wymaga mniej narzutów. – Philipp