对于游戏,我有一个玩家类,其中包含对例如玩家目前拥有的所有仓库。所有操作都使用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
答案 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