У меня есть такой класс:
class RPNExpr
{
std::vector<std::unique_ptr<Expr> > m_exprs;
};
Каждый элемент m_exprs выделяется функцией-построителем в куче, должен быть доступен для чтения другими классами, но полностью принадлежит RPNExpr и должен быть уничтожен, когда RPNExpr выходит за пределы области видимости.
Было бы неплохо, если бы читатели m_exprs могли получить итератор вместо const Expr&, то есть итератор, который скрывает тот факт, что вектор содержит unique_ptrs. Я хотел бы этого для согласованности с другими классами, которые хранят unique_ptrs в своих данных и возвращают им const T&.
Интерфейс для этого может выглядеть примерно так:
class RPNExpr
{
public:
SomeIterator expr_begin();
SomeIterator expr_end();
private:
std::vector<std::unique_ptr<Expr> > m_exprs;
};
Затем потребители должны иметь возможность перебирать Exprs, используя стандартные операторы итератора.
Есть ли хороший способ сделать это? Должен ли я писать векторную оболочку, которая абстрагируется от указателей? Должен ли я вообще не делать этого и использовать что-то другое, кроме unique_ptrs в моем векторе?
boost::ptr_vector
подходящей заменой? - person Siyuan Ren   schedule 04.09.2014boost::ptr_vector
принимает на себя владение всеми указателями на элементы, поэтому вам не нужно и не следует удалять их в ~RPNExpr. И почему вы надеетесь избежать буста? - person Siyuan Ren   schedule 04.09.2014std::iterator
, а неvector<T>::iterator
- person Paul   schedule 04.09.2014