对于一款游戏,我有一个玩家类,其中包含对例如玩家当前拥有的所有仓库。所有 Action 都使用 GameCommands 执行锁步多人游戏。
现在 AI 播放器可以访问世界,因此播放器是只读的,不会意外修改任何导致不同步的内容。所以目前播放器看起来像这样:
class Player{
public:
std::vector<Warehouse*>& getWarehouses(){return warehouses;}
const std::vector<Warehouse*>& getWarehouses() const {return warehouses;}
};
所以现在世界 Controller (游戏命令)可以修改仓库,但 AI 不能。那么问题是:它不能修改容器,但它可以修改包含的元素,这是一个接口(interface)问题。
所以我遇到了 boost::ptr_vector
,它似乎解决了这个问题:存储指针,但如果容器是 const,则所有访问器都返回 const 引用,否则返回引用。这听起来很理想,但不适用于我的情况:玩家仅持有对世界拥有的建筑物的引用。所以它不能删除它们。
是否有一种零开销的方法来获取 std::vector
的常量 View 或告诉 boost vector 不要删除它的项目?它需要快速,因为这种情况在整个代码的不同地方发生,所以它会被经常使用。这很容易做到,所以以前一定有人做过。
进一步限制:仅限 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
关于c++ - 保持常量的指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45950008/