gpt4 book ai didi

c++ - 我如何在 std::vector 中存储没有复制构造函数的类?

转载 作者:行者123 更新时间:2023-11-30 04:54:40 24 4
gpt4 key购买 nike

在我们的项目代码中,不应复制资源类型。

struct Res {
....
Res(const Res& rhs) = delete;
Res& operator=(const Res&) = delete;
Res(Res&&) = delete;
Res& operator=(Res&&) = delete;
};

但是,std 容器似乎都需要复制构造函数。那么我如何将 Res 存储在 std::vector 中呢?

class ResourceCache{
....
const Res& GetRes(size_t index);
std::vector<Res> resources_;
}

最佳答案

由于您删除了复制和移动构造函数/赋值运算符,答案是:您不能使用这样的 vector以任何合理的方式。如果没有复制或移动选项,您最多只能预 reserve空间一次emplace_back进入vector ,但任何可能随后更改容量或以任何方式重新排列元素的操作都是非法的(因为它会隐含地涉及使用移动或复制操作)。

正如评论中提到的,您可以制作一个 vector智能指针,其中只有智能指针必须移动/复制,而不是 Res它指向的实例,并获得一个功能齐全的 vector .例如,使用 std::unique_ptr ,您的类(class)可以实现为:

class ResourceCache{
....
const Res& GetRes(size_t index) {
return *resources_.at(index); // Can still provide const references at API level
}
std::vector<std::unique_ptr<Res>> resources_;
}

你只需要使用 resources_.push_back(std::make_unique<Res>(...args to Res constructor...))resources_ 中创建/插入元素, 而不是 resources_.push_back(Res(...args to Res constructor...)) .

关于c++ - 我如何在 std::vector 中存储没有复制构造函数的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53454817/

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