Tại sao không có std::make_uniquemẫ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::forwardcô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_uniquevớ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 newvà do đó phải sử dụng đơn giản cũ delete:)
make_uniquesẽ được giới hạn trong newphâ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_uniquekhuôn mẫu vì hàm tạo của hàm std::unique_ptrrõ ràng và do đó, nó là dài dòng để trả về unique_ptrtừ 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_ptrcầ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.