gpt4 book ai didi

c++ - 树突变和共享指针问题的访问者模式

转载 作者:行者123 更新时间:2023-12-05 05:56:33 24 4
gpt4 key购买 nike

我正在尝试为 n 元树变异实现访问者模式。目前我坚持使用共享指针。 Mutator 对每个树节点进行操作,并且可以返回指向没有任何更改的节点本身的指针,或者返回指向已修改节点拷贝的指针(无法直接修改原始节点)。但显然我不能从 Visit 方法内的原始指针构建共享指针,我也不能从 Mutate< 内的 this 创建共享指针 方法。我想到的唯一想法是创建另一个类来保存指针并将此类指针传递给访问者,但也许有更好的解决方案?


// Forward declarations
class ExpressionTreeMutator;

struct BaseExpr;

enum class ExpressionType {
kString,
kInt,
};

using ExprPtr = std::shared_ptr<BaseExpr>;

struct BaseExpr {
explicit BaseExpr(ExpressionType expression_type) : expression_type_(expression_type) {}

virtual ~BaseExpr() = default;

virtual ExprPtr Mutate(ExpressionTreeMutator* visitor) const = 0;

ExpressionType expression_type_;
};

// Curiously recurring template pattern
template<typename T>
struct Expr : public BaseExpr {
explicit Expr(ExpressionType expression_type) : BaseExpr(expression_type) {}

~Expr() override = default;

ExprPtr Mutate(ExpressionTreeMutator* visitor) const override;
};

struct String : public Expr<String> {
explicit String(std::string value) : Expr(ExpressionType::kString),
value_(std::move(value)) {}

std::string value_;
};

struct Int : public Expr<Int> {
explicit Int(int64_t value) : Expr(ExpressionType::kInt),
value_(value) {}

int64_t value_;
};

class ExpressionTreeMutator {
public:
virtual ~ExpressionTreeMutator() = default;

protected:
template<typename T>
friend
struct Expr;

virtual ExprPtr Visit(Int const* expr) {
// return expr ??? (in some cases return ptr as it is)
};

virtual ExprPtr Visit(String const* expr) {
// return String::Make(expr) ??? (make a copy)
};
};

template<typename T>
ExprPtr Expr<T>::Mutate(ExpressionTreeMutator* visitor) const {
return visitor->Visit(dynamic_cast<T const*>(this));
}

最佳答案

因为它被标记为 C++20,我建议改用 std::variant 和 std::visit。

否则,您可以从 std::enable_shared_from_this 继承,它允许从 X 的方法中创建 shared_ptr。

您也可以不使用 mutate 进行实际的突变,而是返回进行突变的适当函数对象,然后将 shared_ptr 传递给该对象。

关于c++ - 树突变和共享指针问题的访问者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69144275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com