init boost:: необязательно для некопируемого объекта

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

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

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


person Tomilov Anatoliy    schedule 15.05.2013    source источник


Ответы (1)


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

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

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

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

person Jephir    schedule 26.05.2013
comment
что, если это конструктивно по умолчанию? Есть ли способ создать некопируемый boost::Optional без boost::in_place? мои различные попытки не удалось скомпилировать - person Geronimo; 27.09.2017
comment
Если это конструктор по умолчанию - вызовите boost::in_place без аргументов: Foo foo; foo = boost::in_place(); - person Vladislav; 04.02.2019