C++ c++;使用reinterpret_cast来播放独特的\u ptr<;派生>;*至唯一的\u ptr<;基础>;*用于创建可转换的树结构

C++ c++;使用reinterpret_cast来播放独特的\u ptr<;派生>;*至唯一的\u ptr<;基础>;*用于创建可转换的树结构,c++,tree,abstract-syntax-tree,unique-ptr,reinterpret-cast,C++,Tree,Abstract Syntax Tree,Unique Ptr,Reinterpret Cast,我目前正在编写一个需要操作树结构(抽象语法树)的程序。 在树中,节点拥有其子节点作为唯一的\u ptr,如下所示: struct节点{ //要替换树中的节点本身,请执行以下操作: //指向拥有此节点的唯一\u ptr //节点可以存储在不同的唯一\u ptr类型中 //->例如:NodeY可以存储在unique_ptr或unique_ptr中) //->因此,self必须是唯一的类型\u ptr* 独特的自我; // ... }; 结构NodeX:Node{ 独特的ptr儿童1; 独特的童心;

我目前正在编写一个需要操作树结构(抽象语法树)的程序。
在树中,节点拥有其子节点作为唯一的\u ptr,如下所示:

struct节点{
//要替换树中的节点本身,请执行以下操作:
//指向拥有此节点的唯一\u ptr
//节点可以存储在不同的唯一\u ptr类型中
//->例如:NodeY可以存储在unique_ptr或unique_ptr中)
//->因此,self必须是唯一的类型\u ptr*
独特的自我;
// ...
};
结构NodeX:Node{
独特的ptr儿童1;
独特的童心;
};
结构节点:节点{
独特的ptr儿童1;
独特的ptr儿童2;
其他病媒儿童;
};
结构NodeZ:NodeY{
// ...
};
//还有许多其他具有不同子类型的节点。。。
更改树时,应该可以替换树中的节点。
为此,我在每个节点中存储一个
self
指针,指向所属的唯一\u ptr。 替换操作如下所示:

//可以替换节点:
无效访问节点(节点*节点){
if(节点->某些条件){
//替换
自动新建节点=使_唯一();
唯一\u ptr*self=node->self;
//替换为make_unique()将破坏继承层次结构,但我不会这样做:)
*self=move(newNode);//替换和删除旧节点
node=self.get();//获取新地址
node->self=self;//self仍然指向相同的地址,只有unique\u ptr的内容已更改
}
}
现在的问题是在构造节点后设置
self
指针。
为了实现这一点,我正在使用
重新解释\u cast

void createNodeX_子项(NodeX*NodeX){
//创造孩子气
nodex->childY=make_unique();
// ...
//这是省钱吗?
nodex->childY->self=reinterpret\u cast(&nodex->childY);
}

我现在的问题是:只要我没有像上面提到的那样破坏继承层次结构,就可以用这种方式使用reinterpret\u cast保存吗?

不要
reinterpret\u cast
。您可以使用
std::unique\u ptr
以多态方式转移所有权。

不要
重新解释\u cast
。您可以使用
std::unique\u ptr
以多态方式转移所有权。

重新解释转换实际上不是在任意类型之间转换。有一个列表,列出了您可以使用它执行的允许强制转换()。如果您不在列出的情况中,那么您使用的是reinterpret cast错误reinterpret\u cast实际上不是在任意类型之间进行转换。有一个列表,列出了您可以使用它执行的允许强制转换()。如果您不在列出的情况中,那么您使用的reinterpret cast是错误的