在C ++中,我可以将某些内容移出std :: variant吗?

问题描述 投票:1回答:1

我有一个资源包装器类,该类是不可复制的,但可以移动。像这样的东西(伪代码)

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在返回值中表示这一点。例如:

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

这很有意义,因为结果仍然存在,但是如何访问它?

c++ stl std-variant
1个回答
1
投票

糟糕,我在发布问题两分钟后解决了这个问题。

您可以将std::move变体转换为std::get

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

或只是内联它,这样变体将成为临时右值

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

[[Update:]我本来是说std​​ :: move破坏了原始变体,但是正确地纠正了它没有...但是发生的是变体内部的包装器在移出时被破坏了,这是预期的

© www.soinside.com 2019 - 2024. All rights reserved.