2013-05-15 50 views
10

Tôi nên làm gì để khởi tạo boost::optional<T> nếu kiểu cơ bản T là không thể mặc định, không thể sao chép/di chuyển được, nhưng vẫn có thể tồn tại?init boost :: tùy chọn đối tượng không thể sao chép

Is it cấm cho boost::optional bởi bất kỳ lý do ngữ nghĩa có một số chức năng thành viên như template< typename... Args > boost::optional<T>::construct(Args && ...args), mà cung cấp tất cả các đối số tại chỗ operator new để xây dựng các đối tượng hoàn toàn (đối với phi ref loại T)? Biến thể là có chức năng không phải thành viên như std::make_shared<T>. Có vẻ như với tôi, vấn đề của tôi có thể được giải quyết bằng cách sử dụng std::unique_ptr/std::shared_ptr, nhưng trong trường hợp này câu hỏi của tôi là: "Tại sao boost::optional tiến trình bị đóng băng?".

Trả lời

14

boost::optional có thể được khởi tạo bằng loại không thể sao chép được bằng cách sử dụng in-place factories.

Cụ thể, bạn có thể sử dụng chúng như thế này:

#include <boost/optional.hpp> 
#include <boost/utility/in_place_factory.hpp> 

class MyType : private boost::noncopyable 
{ 
public: 
    MyType(T1 const& arg1, T2 const& arg2); 
} 
... 
boost::optional<MyType> m_var; 
... 
m_var = boost::in_place(arg1, arg2); 
... 

Trong C++ 14 có được một đề xuất std::make_optional đó sẽ là một giải pháp tốt hơn cho vấn đề này. Tuy nhiên, điều này đã không được thực hiện trong Boost.Optional.

+0

nếu cấu hình mặc định là gì? Có cách nào để xây dựng một tăng noncopyable :: tùy chọn mà không cần tăng :: in_place? những nỗ lực khác nhau của tôi đã không biên dịch được – Geronimo

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