gpt4 book ai didi

c++ - 在 C++ 中,我可以从 std::variant 中移出一些东西吗?

转载 作者:行者123 更新时间:2023-12-01 14:53:34 25 4
gpt4 key购买 nike

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

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

这一切都很好,但是我有很多这样的,我有一个函数可以解析一些数据并返回一个包装器或一个替代包装器。我想过用 std::variant用返回值来表达这一点。例如。
std::variant<Wrapper, AlternativeWrapper> LoadData(void* bytes, size_t len)
{ ... }

我可以编写这个函数,并且它都可以编译。 IE。我在 LoadData 函数中构造了一个 Wrapper,然后我可以将它移动到然后返回的变体中。

但另一方面,当我想取出值时,会出现此错误(MSVC2019)
error C2280: 'Wrapper::Wrapper(const Wrapper&)': attempting to reference a deleted function

我的代码看起来像这样。
auto result = LoadData(bytes, len);
std::get<Wrapper>(result);

这是有道理的,因为结果仍然存在,但是我该如何访问它呢?

最佳答案

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

您可以 std::move变体变成 std::get .

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

或者只是内联它,这样变体就变成了一个临时的右值
std::get<Wrapper>(LoadData(bytes, len));

[更新:]我最初说 std::move 破坏了原始变体,但正确地更正了它没有......但是发生的情况是变体中的 Wrapper 在移出时被破坏,这正如预期的那样

关于c++ - 在 C++ 中,我可以从 std::variant 中移出一些东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60218749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com