У меня есть структуры данных, которые обычно управляются через std::unique_ptr
, например, выражения в AST.
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
};
Но мне не нравится это дополнительное косвенное обращение через смарт-указатель в векторе, и я думаю, что оно не выражает семантическуюкоторый я хочу иметь.
Вместо умных указателей, владеющих выражениями, я думаю, что вектор должен владеть выражениями.
Но у меня проблема в том, что выражения всегда создаются в умных указателях (или, по крайней мере, в виде необработанных указателей):
std::unique_ptr<Expr> parse_expr() { ... }
Существует ли элегантный способ передачи владения от вызовов parse_expr
(которые имеют тип std::unique_ptr<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>