2013-05-15 11 views
10

기본 유형 T이 기본 구성 가능하고 복사 불가능/이동 가능하지만 인스턴스가 여전히 존재할 수 있다면 boost::optional<T>을 초기화하려면 어떻게해야합니까? init boost : 복사 할 수없는 객체의 선택형

은 그 모든 인수를 제공, template< typename... Args > boost::optional<T>::construct(Args && ...args) 같은 일부 멤버 함수가 어떤 의미 이유로 boost::optional가 금지되어있는 장소 (비 REF 유형 T에 대해) 완전히 객체를 생성하는 operator new? 변형은 std::make_shared<T>과 같은 비회원 함수를가집니다.

내 문제는 std::unique_ptr/std::shared_ptr을 사용하여 해결할 수 있지만이 경우 내 질문은 "boost::optional 진행률이 고정되어 있습니까?"입니다.

답변

14

boost::optionalin-place factories을 사용하여 복사 불가능 유형으로 초기화 할 수 있습니다.

특히, 다음과 같이 사용할 수 있습니다 : C++ 14에서

#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); 
... 

을이 문제에 대한 더 나은 해결책이 될 것이라고 제안 std::make_optional있다. 그러나 이것은 Boost.Optional에서 구현되지 않았습니다.

+0

기본 구성 가능하면 어떨까요? noncopyable boost : : boost :: in_place없이 옵션을 구성하는 방법이 있습니까? 내 다양한 ​​시도가 컴파일에 실패했습니다. – Geronimo