保持常量的指针向量

Pointer vector that preserves constness

对于一个游戏,我有一个玩家 class 持有例如玩家当前拥有的所有仓库。所有动作都使用 GameCommands 执行锁步多人游戏。

现在 AI 播放器可以访问世界,因此播放器是只读的,不会意外修改任何导致不同步的内容。所以目前播放器看起来像这样:

class Player{
  public:
    std::vector<Warehouse*>& getWarehouses(){return warehouses;}
    const std::vector<Warehouse*>& getWarehouses() const {return warehouses;}
};

所以现在世界控制器(游戏命令)可以修改仓库但 AI 不能。那么问题是:它不能修改容器,但它可以修改包含的元素,这是一个接口问题。

所以我遇到了 boost::ptr_vector,这似乎解决了这个问题:存储指针,但所有访问器 return 如果容器是 const 则引用 const,如果不是则引用。这听起来很理想,但不适用于我的情况:玩家仅持有对世界拥有的建筑物的引用。所以一定不能删除它们。

是否有一种零开销的方法来获取 std::vector 的一种常量视图或告诉 boost 向量不要删除它的项目?它需要快速,因为这种情况在整个代码的不同地方发生,所以它会被经常使用。做起来很容易,以前肯定有人做过。

进一步限制:仅限 C++03

有一个 CloneAllocator view_clone_allocator 可以完全满足要求:Copy 只复制指针,delete 什么都不做。因此,所有需要做的就是将这些容器存储为 boost::ptr_vector<T, boost::view_clone_allocator>,仅此而已。

参考:http://www.boost.org/doc/libs/1_55_0/libs/ptr_container/doc/reference.html#id21