保留常量的指针向量

时间:2017-08-30 00:07:00

标签: c++ pointers vector boost c++03

对于游戏,我有一个玩家类,其中包含对例如玩家目前拥有的所有仓库。所有操作都使用GameCommands执行锁步多人游戏。

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

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

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

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

是否有零开销方式获取std::vector的一种const视图或告诉boost矢量不删除其项目?它需要很快,因为这样的情况会发生在整个代码的不同位置,所以它会经常使用。它很容易做到以前一定要做。

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

1 个答案:

答案 0 :(得分:1)

CloneAllocator view_clone_allocator可以完全满足要求:复制只复制指针而删除不执行任何操作。因此,所有人需要做的就是将这些容器存储为boost::ptr_vector<T, boost::view_clone_allocator>,就是这样。

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