2012-02-03 54 views
5

Trong khi tôi có std::tr1::shared_ptr<T> có sẵn trong trình biên dịch của mình, tôi không có make_shared.C++ make_shared không có sẵn

Ai đó có thể chỉ cho tôi cách triển khai thích hợp make_shared không? Tôi thấy rằng tôi cần sử dụng các vararg để cung cấp các đối số cho hàm tạo của T.

Nhưng tôi cũng không có các mẫu có sẵn trong trình biên dịch của mình.

+2

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. –

+0

Bạn đang sử dụng trình biên dịch nào? – jalf

+0

@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. –

Trả lời

6

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)...)); 
} 
+0

Phiên bản variadic của Gigi cũng để lại một backtrace thích hợp như được thảo luận tại đây: http://stackoverflow.com/questions/9233358/debuggable-replacement- để chia sẻ – srking

Các vấn đề liên quan