Init boost:: необязательный объект, не подлежащий копированию

Что мне делать, чтобы инициализировать boost::optional< T >, если базовый тип T нестандартно конструктивен, не копируется/перемещается, но один экземпляр все еще может существовать?

Невозможно ли для boost::optional для boost::optional по каким-либо семантическим причинам использовать некоторую функцию-член, например template< typename... Args > boost::optional< T >::construct(Args && ...args), которая предоставляет все аргументы на месте operator new для полного создания объекта (для не-ref type T)? Вариант должен иметь функцию, отличную от члена, например std::make_shared< T >.

Мне кажется, что моя проблема может быть решена с помощью использования std::unique_ptr/std::shared_ptr, но в этом случае мой вопрос: "Почему прогресс boost::optional заморожен?".

Ответ 1

boost::optional может быть инициализирован неконвертируемым типом с помощью на месте фабрик.

В частности, вы можете использовать их следующим образом:

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

В С++ 14 предлагается std::make_optional, что было бы лучшим решением этой проблемы. Однако это не было реализовано в Boost.Optional.