我有一些数据结构通常使用 std::unique_ptr
进行管理,例如语法树中的表达式。
struct BinExpr {
std::unique_ptr<Expr> left; // Left owns the expression
std::unique_ptr<Expr> right; // Right owns the expression
};
在大多数情况下,它可以很好地工作。
但有时我没有固定数量的表达式,例如在列表中。
struct ListExpr {
std::vector<std::unique_ptr<Expr>> exprs; // Exprs owns pointers which each own an expression
};
但是我不喜欢通过vector中的智能指针进行额外的间接操作,而且我认为它并没有表达我想要的语义。
相比让智能指针拥有这些表达式,我认为vector应该拥有这些表达式。
但是我遇到了一个问题,那就是表达式总是在智能指针中创建(或者至少是作为原始指针):
std::unique_ptr<Expr> parse_expr() { ... }
有没有一种优雅的方法将类型为std::unique_ptr<Expr>
的parse_expr
调用的所有权转移给std::vector<Expr>
?当然,在这样做时Expr
不能被复制。
std::vector<Expr> exprs;
exprs.push_back(move_from_ptr_to_vec(parse_expr()));
基本上,目前我的使用方式如下
std::vector<std::unique_ptr<Expr>> exprs;
exprs.push_back(std::move(parse_expr()));
return std::unique_ptr<ListExpr>(exprs); // List has a std::vector<std::unique_ptr<Expr>>
但我想要那样
std::vector<Expr> exprs;
exprs.push_back(parse_expr());
return std::unique_ptr<ListExpr>(exprs); // List has a std::vector<Expr>
std::unique_ptr
拥有,则将std::unique_ptr
放在向量中是最好的选择。 将对象放入向量中而不进行复制或移动是不可能的。 - Slavaexprs.push_back(std::move(parse_expr()));
- Slavaexprs()
返回对象作为std_unique_ptr
?在这里改变语义已经太晚了。 - Slava