У меня есть класс-обертка ресурсов, который не может быть скопирован, но может быть перемещен. Примерно так (псевдокод)
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);
Это имеет смысл, так как результат все еще остается, но тогда как мне получить к нему доступ?