如何制作深层结构指针?

问题描述 投票:2回答:1

比方说,我想用C++来表示一棵二进制树。通常情况下,我想要一个 Node 这样的结构。

struct Node {
  Node* left
  Node* right;
};

(在这里我使用struct和原始指针只是为了简单。我知道我应该使用智能指针来管理内存)。)

这种表示方式有一个问题:我永远不可能有一个深层的?const (如果可以的话,请纠正我。) (如果可以的话,请纠正我的说法。)我可以标记一个单一的。Node const,但它的子代被硬编码为非constNode 结构。

(我可能会用一些 templateleftright 可选 const但是,这就会使 Node 和非const Node 不兼容)。)

很快我就发现,如果我神奇地拥有一些深----------。const 指针 deep_const_pointer,这使得 constness transitive),我可以用这个指针在 Node 以致于 const 节点自动意味着有一个 const 子树。

我试着写了一个深const 指针类,这就是我最终的结果。

template <typename T>
class deep_const_pointer {
public:
  explicit deep_const_pointer(const T* p_)
    : p{const_cast<T*>(p_)} {}

  const T& operator*() const { return *p; }
  T& operator*() { return *p; }

  const T* operator->() const { return p; }
  T* operator->() { return p; }

  // etc.

private:
  T* p;
};

在这里我投出了 const 的构造函数中,并可选择将其根据 constness of this pointer-like object. 但是,本实施例允许以下情况。

const int i = 42;
deep_const_pointer<int> p{&i};
*p = 0; // Oops!

所以,这取决于用户是否正确地标记出这个指针是否是... ... const 或不。

应该如何构建一个深。const 指针类?理想的情况是,我想用 const 检查发生在编译时,而那个指针类和一个原始指针一样占用内存。(这就排除了保存 const对一个 bool 成员变量,并对每次访问进行检查。)

编辑: 我查过了 std::experimental::propagate_const从我的角度来看,它的确不是一个 "深层建筑 "指针。我所说的 "深层建筑指针 "是指 P 是。

  1. Constant P 是指向const的指针。
  2. 可变 P 是指向可变的指针。
  3. 对一个非静态的 P 被当作是一个const P;
  4. 由于指针到const具有值语义,所以const的 P 应该是可以轻易复制的。

propagate_const 不符合要求,因为。

  1. 它从未接受过指向const的指针。
  2. 不可复制(复制构造函数被明确删除)。

从我收到的评论和回答来看,我想这样的一个... P 在C++中是无法实现的。

c++ pointers const transitive-const
1个回答
0
投票

编写一个转义的const 聪明的指针是一个解决的问题,只要查一下。std::experimental::propagate_const<>. 要找到合适的实现应该不难。

在你自己的尝试中,你把从原始指针构造的方法弄错了。你不应该添加 const 到尖型,也不能用铸型把它剥离出来。固定的。

explicit deep_const_pointer(T* p_)
    : p{p_} {}
© www.soinside.com 2019 - 2024. All rights reserved.