Đề xuất của bạn (gọi số shared_ptr<T>
hàm tạo không có đối số) là chính xác. (Gọi hàm khởi tạo với giá trị 0 là tương đương.) Tôi không nghĩ rằng điều này sẽ chậm hơn gọi số vec.push_back()
với số sẵn có shared_ptr<T>
, vì yêu cầu xây dựng trong cả hai trường hợp (xây dựng trực tiếp hoặc sao chép-xây dựng).
Nhưng nếu bạn muốn cú pháp "đẹp hơn", bạn có thể thử đoạn mã sau:
class {
public:
template<typename T>
operator shared_ptr<T>() { return shared_ptr<T>(); }
} nullPtr;
này khai báo một đối tượng toàn cầu duy nhất nullPtr
, cho phép cú pháp tự nhiên sau đây:
shared_ptr<int> pi(new int(42));
shared_ptr<SomeArbitraryType> psat(new SomeArbitraryType("foonly"));
...
pi = nullPtr;
psat = nullPtr;
Note nếu bạn sử dụng điều này trong nhiều đơn vị dịch (tệp nguồn), bạn sẽ cần đặt tên cho lớp (ví dụ: _shared_null_ptr_type
), di chuyển định nghĩa của đối tượng nullPtr
sang tệp .cpp riêng biệt và thêm extern
khai báo trong t ông tập tin tiêu đề nơi lớp được xác định.
Nguồn
2009-03-07 04:31:33
tin tốt từ tiêu chuẩn C++ tiếp theo: ở đó, bạn có thể viết "vec.emplace_back();" và có thêm một con trỏ null: –
Hãy xem xét sử dụng 'boost :: ptr_vector' mà đòi hỏi ít chi phí hơn. – Philipp