Dưới đây là một giải pháp (ngoài Mike):
#include <type_traits>
#include <utility>
#include <memory>
template <class T, class ...Args>
typename std::enable_if
<
!std::is_array<T>::value,
std::unique_ptr<T>
>::type
make_unique(Args&& ...args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
template <class T>
typename std::enable_if
<
std::is_array<T>::value,
std::unique_ptr<T>
>::type
make_unique(std::size_t n)
{
typedef typename std::remove_extent<T>::type RT;
return std::unique_ptr<T>(new RT[n]);
}
int main()
{
auto p1 = make_unique<int>(3);
auto p2 = make_unique<int[]>(3);
}
Ghi chú:
- mới T [n] nên chỉ mặc định xây dựng n T's.
Vì vậy make_unique (n) chỉ nên mặc định xây dựng n T.
- Các vấn đề như thế này góp phần tạo nên make_unique không được đề xuất trong C++ 11. Một vấn đề khác là: Chúng tôi có xử lý các thông số tùy chỉnh không?
Đây không phải là câu hỏi không trả lời được. Nhưng họ là những câu hỏi chưa được trả lời đầy đủ.
Nguồn
2012-04-14 01:14:03
... nhưng những câu hỏi này đã được (một phần) được trả lời trong C++ 14 và make_unique giờ đây [phong phú hơn] (http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique). – einpoklum
@einpoklum: Đúng. Lưu ý ngày trên Q/A. –