Как инициализировать неперемещаемый и некопируемый член класса - boost:: optional

У меня есть неподвижный и некопируемый тип:

struct A
{
    A(std::string p1, int p2){}
    A(A const &) = delete;
    A(A&&) = delete;
    A& operator=(A const &) = delete;
    A& operator=(A&) = delete;
};

Я могу создать необязательный boost следующим образом:

boost::optional<A> op(boost::in_place("abc", 5));

Мне также нужно инициализировать boost::optional<A>, который является членом класса. Вот мое решение:

class B
{
public:
    B(const boost::optional<A>& op): op_(op) {} 
private:
    const boost::optional<A>& op_;
};

B b(boost::optional<A>(boost::in_place("abc", 5)));

Можно ли иметь только член класса boost::optional<A> и как-то инициализировать его?

Изменить (пояснение) Я хотел бы иметь элемент данных класса boost::optional<A> op_, но не знаю, как его инициализировать.


person Irbis    schedule 01.04.2019    source источник
comment
Вам нужен элемент данных boost::optional<A> op_, как было предложено в последнем вопросе, или элемент данных const boost::optional<A>& op_, как в определении B. Это имеет большое значение.   -  person lubgr    schedule 01.04.2019
comment
Пожалуйста, смотрите Редактировать1   -  person Irbis    schedule 01.04.2019


Ответы (1)


Вы можете объявить конструктор B как

class B {
  public:
      B(std::string p1, int p2) :
         op_(boost::in_place<A>(std::move(p1), p2)) {}

  private:
    const boost::optional<A> op_;
};

и создайте экземпляр B как

B b("abc", 5);

Обратите внимание, что я изменяю член данных op_, чтобы он не был здесь ссылкой, в отличие от определения B в вашем вопросе.

person lubgr    schedule 01.04.2019
comment
Можно ли создать класс с вариативным конструктором шаблонов и пересылать аргументы в boost::in_place ? - person Irbis; 01.04.2019
comment
Да. Используйте для этого template <class ...Args> B(Args&&... args) : op_(boost::in_place<A>(std::forward<Args>(args)...)) {}. Но обратите внимание, что это многое, вы можете прочитать соответствующий пункт в книге Скотта Мейера «Эффективный современный C++» по этой теме. - person lubgr; 01.04.2019