Как инициализировать неподвижный и не копируемый член класса - boost :: необязательный - PullRequest
0 голосов
/ 01 апреля 2019

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

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::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_, но я не знаю, как его инициализировать.

1 Ответ

2 голосов
/ 01 апреля 2019

Вы можете объявить конструктор 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 в вашем вопросе.

...