2013-05-15 24 views
10

Co należy zrobić, aby zainicjować boost::optional<T>, jeśli podstawowy typ T nie jest domyślną konstrukcyjną, niekopiowalną/ruchomą, ale czyja instancja nadal istnieje?init boost :: opcjonalny niekopiowalny obiekt

Zabrania dla boost::optional żadnymi semantycznych powodów, aby mieć jakąś funkcję składową podobnego template< typename... Args > boost::optional<T>::construct(Args && ...args), który dostarcza wszystkie argumenty w miejscu operator new na budowę obiektu w całości (dla non-ref typu T)? Wariant ma mieć funkcję nie będącą członkiem, taką jak std::make_shared<T>.

Wydaje mi się, że mój problem może być rozwiązany poprzez zastosowanie od std::unique_ptr/std::shared_ptr, ale w tym przypadku moje pytanie brzmi: „Dlaczego boost::optional postęp jest zamrożony?”.

Odpowiedz

14

boost::optional można zainicjować za pomocą typu, który nie może być kopiowany, za pomocą in-place factories.

Konkretnie, można ich używać tak:

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

w C++ 14 nie jest proponowana std::make_optional że byłby lepszym rozwiązaniem tego problemu. Jednak nie zostało to zaimplementowane w Boost.Optional.

+0

co, jeśli domyślne jest skonstruowane? Czy istnieje sposób na skonstruowanie niekopiowanego boostu :: opcjonalnie bez boost :: in_place? moje różne próby nie udało się skompilować – Geronimo