在我们的项目代码中,不应复制资源类型。
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_;
}
答案 0 :(得分:1)
由于您已经删除了复制和移动构造函数/赋值运算符,因此答案是:您无法以任何合理的方式使用此类vector
。如果不选择复制或移动,则最多只能将reserve
空格一次和emplace_back
预先放入vector
,但是随后可能更改容量或以任何方式重新排列元素都是非法的(因为这将隐式涉及使用移动或复制操作)。
但是如评论中所述,您可以制作一个vector
智能指针,其中仅该智能指针必须被移动/复制,而不是它指向的Res
实例,并获得一个完整的指针。功能vector
。例如,使用std::unique_ptr
,您的类可以实现为:
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...))
。