c++ - 保持常量的指针 vector

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

对于一款游戏,我有一个玩家类,其中包含对例如玩家当前拥有的所有仓库。所有 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/

相关文章:

c++ - 派生类的重载解析失败

c - unsigned long 到 char 数组

C 指针和内存地址的澄清

c++ - Eclipse C++ 上 vector 实例化的无效模板参数

vector - 将值切片转换为字节切片

c++ - decltype(function_name) 的返回类型完全没用?

c++ - `if` 语句在取模之前和分配操作之前是多余的吗?

c# - 帮助我将以下 VB/C++ 代码转换为 C#

c++ - c++中指针列表的最后一个元素

c++ - 我的solve(字符串a,字符串b)的输出与Shuffle Hashing中的预期输出不匹配