比方说,我想用C++来表示一棵二进制树。通常情况下,我想要一个 Node
这样的结构。
struct Node {
Node* left
Node* right;
};
(在这里我使用struct和原始指针只是为了简单。我知道我应该使用智能指针来管理内存)。)
这种表示方式有一个问题:我永远不可能有一个深层的?const
(如果可以的话,请纠正我。) (如果可以的话,请纠正我的说法。)我可以标记一个单一的。Node
const,但它的子代被硬编码为非const
在 Node
结构。
(我可能会用一些 template
斫 left
和 right
可选 const
但是,这就会使 Node
和非const
Node
不兼容)。)
很快我就发现,如果我神奇地拥有一些深----------。const
指针 deep_const_pointer
,这使得 const
ness 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
的构造函数中,并可选择将其根据 const
ness 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
是。
P
是指向const的指针。P
是指向可变的指针。P
被当作是一个const P
;P
应该是可以轻易复制的。propagate_const
不符合要求,因为。
从我收到的评论和回答来看,我想这样的一个... P
在C++中是无法实现的。
编写一个转义的const
聪明的指针是一个解决的问题,只要查一下。std::experimental::propagate_const<>
. 要找到合适的实现应该不难。
在你自己的尝试中,你把从原始指针构造的方法弄错了。你不应该添加 const
到尖型,也不能用铸型把它剥离出来。固定的。
explicit deep_const_pointer(T* p_)
: p{p_} {}