В C ++ я могу переместить что-то из std :: варианта? - PullRequest
2 голосов
/ 14 февраля 2020

У меня есть класс-обертка ресурсов, который не может быть скопирован, но может быть перемещен. Примерно так (псевдокод)

class Wrapper {
  SomeResource* m_handle = nullptr;
public:
  Wrapper(const Wrapper&) = delete;
  Wrapper& operator=(const Wrapper&) = delete;

  Wrapper(SomeResource* handle) : m_handle(handle) { }
  Wrapper(Wrapper&& other) {
    std::swap(m_handle, other.m_handle);
  }
}

Это все хорошо, но у меня их несколько, и у меня есть функция, которая анализирует некоторые данные и возвращает ЛИБО Wrapper или альтернативную оболочку. Я думал об использовании std::variant до express в возвращаемом значении. Например,

std::variant<Wrapper, AlternativeWrapper> LoadData(void* bytes, size_t len)
{ ... }

Я могу написать эту функцию, и она все компилируется. Т.е. я создаю оболочку внутри функции LoadData, затем я могу переместить ее в вариант, который затем возвращается.

Но с другой стороны, когда я хочу вывести значение, получим эту ошибку (MSVC2019)

error C2280: 'Wrapper::Wrapper(const Wrapper&)': attempting to reference a deleted function

Мой код выглядит следующим образом.

auto result = LoadData(bytes, len);
std::get<Wrapper>(result);

Это имеет смысл, так как результат все еще остается, но тогда как мне получить к нему доступ?

1 Ответ

1 голос
/ 14 февраля 2020

Упс, я решил это через две минуты после публикации вопроса.

Вы можете std::move вариант в std::get.

auto v = LoadData(bytes, len);
std::get<Wrapper>(std::move(v));

Или просто вставить его, чтобы вариант становится временным значением

std::get<Wrapper>(LoadData(bytes, len));

[Update:] Я первоначально сказал, что std :: move уничтожил оригинальный вариант, но был правильно исправлен, что это не ... однако, что происходит, так это Обертка внутри варианта уничтожается при его выдвижении, как и ожидалось

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...