如何将const weak_ptr放入STL容器中

How to put a const weak_ptr into a STL container

本文关键字:STL 放入 ptr const weak      更新时间:2023-10-16

我有一个类TileManager,它管理对象的生存期,因此在对象上拥有一个shared_ptr:

class TileManager {
private:
std::vector<std::shared_ptr<const Tile>> tiles;
}

现在我有了另一个类Map,它包含对TileManager管理的对象的非拥有引用:

class Map {
private:
std::vector<std::weak_ptr<const Tile>> tiles;
}

我的问题是:我不希望Map类能够操作指向Tile的智能指针。因此,我想使向量内部的指针const:

class Map {
private:
std::vector<const std::weak_ptr<const Tile>> tiles;
}

不幸的是,不可能将const对象放入STL容器中。

有人知道解决方案吗?也许是完全不同的设计?

存储在vector中的元素不能是const,因为它们必须是可赋值的。vector能够以任何可观察的方式"操纵"指针的唯一方法是破坏到给定对象的最后一个weak_ptr,这将导致对应shared_ptr的控制块被释放(假设没有其他shared_ptr仍然引用它)。

简而言之,您可以安全地将非constweak_ptr存储在向量中。

如果可能,您可以使用std::set。由于从集合访问数据的唯一方法只提供常量引用或常量迭代器,因此无法直接操作这些值。

要做到这一点,你可以使用

CCD_ 10。

另一种非技术性的解决方案是通过设计来实现,因为它可能是你的类的私人成员:只需在你的类设计中说"不要重置或覆盖弱指针"。