Ваше предложение (вызов конструктора shared_ptr<T>
без аргумента) является правильным. (Вызов конструктора со значением 0 эквивалентен.) Я не думаю, что это было бы медленнее, чем вызов vec.push_back()
с уже существующим shared_ptr<T>
, так как в обоих случаях требуется строительство (прямая конструкция или копирование).
Но если вы хотите «приятнее» синтаксис, вы можете попробовать следующий код:
class {
public:
template<typename T>
operator shared_ptr<T>() { return shared_ptr<T>(); }
} nullPtr;
Это объявляет один глобальный объект nullPtr
, который позволяет следующий естественный синтаксис:
shared_ptr<int> pi(new int(42));
shared_ptr<SomeArbitraryType> psat(new SomeArbitraryType("foonly"));
...
pi = nullPtr;
psat = nullPtr;
Примечание что если вы используете это в нескольких единицах перевода (исходные файлы), вам нужно указать класс имени (например, _shared_null_ptr_type
), переместить определение объекта nullPtr
в отдельный .cpp-файл и добавить объявления extern
в t он заголовочный файл, где определяется класс.
хорошие новости от стандарта на следующий C++: там, вы можете написать "vec.emplace_back();" и получить нулевой указатель append :) –
Рассмотрите возможность использования 'boost :: ptr_vector', для которого требуется меньше накладных расходов. – Philipp