Nếu trình biên dịch của bạn không thực hiện make_shared và bạn không thể sử dụng tăng, và bạn không nhớ việc thiếu tối ưu hóa phân bổ đơn cho cả đối tượng và bộ đếm tham chiếu thì make_shared giống như thế này :
Without variadic mẫu hỗ trợ:
// zero arguments version
template <typename T>
inline shared_ptr<T> make_shared()
{
return shared_ptr<T>(new T());
}
// one argument version
template <typename T, typename Arg1>
inline shared_ptr<T> make_shared(Arg1&& arg1)
{
return shared_ptr<T>(new T(std::forward<Arg1>(arg1)));
}
// two arguments version
template <typename T, typename Arg1, typename Arg2>
inline shared_ptr<T> make_shared(Arg1&& arg1, Arg2&& arg2)
{
return shared_ptr<T>(new T(std::forward<Arg1>(arg1),
std::forward<Arg2>(arg2)));
}
// ...
Nếu trình biên dịch của bạn không hỗ trợ tài liệu tham khảo r có giá trị, sau đó đưa ra 2 phiên bản dành cho mỗi đối số đếm: một const Arg & và một Arg &
Với mẫu variadic hỗ trợ:
template <typename T, typename... Args>
inline shared_ptr<T> make_shared(Args&&... args)
{
return shared_ptr<T>(new T(std::forward<Args>(args)...));
}
Nếu không có mẫu variadic, bạn sẽ cần nhiều phiên bản của 'make_shared', một cho không tranh cãi, một cho một đối số, một cho hai đối số , v.v. –
Bạn đang sử dụng trình biên dịch nào? – jalf
@BenVoigt: Các mẫu biến thể không phải là một trở ngại lớn. Sự vắng mặt của các tham chiếu rvalue làm cho 'make_shared' kém mạnh hơn trong C++ 03, nhưng bạn vẫn có thể có tối ưu hóa thực hiện phân bổ đơn lẻ, cũng như ngoại lệ-an toàn mà một hàm nhà máy cung cấp. –