c++ - 优雅地比较 C++ 中的多态树
问题描述
我有一棵多态对象树。我需要遍历两棵树并比较节点。如果节点具有不同的类型,则它们不相等。考虑这个层次结构:
struct Visitor;
struct Base {
virtual ~Base() = default;
virtual void accept(Visitor &) = 0;
};
using BasePtr = std::unique_ptr<Base>;
struct A final : Base {
void accept(Visitor &) override;
int data;
};
struct B final : Base {
void accept(Visitor &) override;
BasePtr child;
};
struct C final : Base {
void accept(Visitor &) override;
std::vector<BasePtr> children;
};
struct Visitor {
virtual void visit(const A &) = 0;
virtual void visit(const B &) = 0;
virtual void visit(const C &) = 0;
};
我知道如何实现这些功能:
bool equalNode(const A &, const A &);
bool equalNode(const B &, const B &);
bool equalNode(const C &, const C &);
我在问我应该如何实现这个功能:
bool equalTree(const Base *, const Base *);
我如何优雅地equalTree
使用equalNode
访问者模式?
解决方案
就像是
struct RhsVisitor : public Visitor
{
bool result;
};
struct AEqualVisitor : public RhsVisitor
{
void visit(const A & rhs) override { result = equalNode(lhs, rhs); }
void visit(const B &) override { result = false; }
void visit(const C &) override { result = false; }
const A & lhs;
};
和类似B
的C
struct LhsVisitor : public Visitor
{
void visit(const A & a) override { rhsVisitor = std::make_unique<AEqualVisitor>(a); }
void visit(const B & b) override { rhsVisitor = std::make_unique<BEqualVisitor>(b); }
void visit(const C & c) override { rhsVisitor = std::make_unique<CEqualVisitor>(c); }
std::unique_ptr<RhsVisitor> rhsVisitor;
};
bool equalTree(const Base * lhs, const Base * rhs)
{
LhsVisitor vis;
lhs->accept(vis);
rhs->accept(*vis.rhsVisitor);
return vis.rhsVisitor->result;
};
推荐阅读
- javascript - 在视口之外创建 div 时,溢出滚动将不起作用
- javascript - 如何在返回函数中使用 Object.entries - reactjs
- c# - 如何在静态堆栈中进行乘法和除法?
- javascript - 从本地存储加载样式表时防止 FOUC
- ios - 如何加载包含数百个 UIImage 实例的数组而不会因为内存激增而导致应用程序崩溃?
- php - 我在 wamp 中收到关于 PHP 路径的错误
- php - HTTP/1.0 405 Method Not Allowed and false with CURL
- javascript - 使用纯文本而不是提及来定义用户
- batch-processing - 根据 Odoo 中的用户选择批量创建
- linux - 如何将linux命令日志捕获到文件中?