Tại sao không có std::make_unique
mẫu hàm trong thư viện C ++ 11 tiêu chuẩn? Tôi tìm thấy
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
dài dòng một chút. Không phải sau đây sẽ đẹp hơn nhiều?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
Điều này ẩn giấu new
độc đáo và chỉ đề cập đến loại một lần.
Dù sao, đây là nỗ lực của tôi trong việc thực hiện make_unique
:
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
Tôi mất khá nhiều thời gian để có được std::forward
công cụ biên dịch, nhưng tôi không chắc liệu nó có đúng không. Là nó? Chính xác thì std::forward<Args>(args)...
có nghĩa là gì? Trình biên dịch làm gì cho điều đó?
make_unique
với một deleter tùy chỉnh, bởi vì rõ ràng nó phân bổ thông qua cũ đơn giản new
và do đó phải sử dụng đơn giản cũ delete
:)
make_unique
sẽ được giới hạn trong new
phân bổ ... tốt, thật tốt nếu bạn muốn viết nó, nhưng tôi có thể thấy tại sao một cái gì đó như thế không phải là một phần của tiêu chuẩn.
make_unique
khuôn mẫu vì hàm tạo của hàm std::unique_ptr
rõ ràng và do đó, nó là dài dòng để trả về unique_ptr
từ một hàm. Ngoài ra, tôi thích sử dụng auto p = make_unique<foo>(bar, baz)
hơn std::unique_ptr<foo> p(new foo(bar, baz))
.
unique_ptr
cần có một tham số mẫu thứ hai mà bạn nên cho phép bằng cách nào đó - khác vớishared_ptr
.