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.