Нет: std::vector<shared_ptr<Foo> >
и std::vector<shared_ptr<const Foo> >
- это разные типы, поэтому вы не можете рассматривать объект одного объекта как объект другого типа.
Если вам действительно нужен std::vector<shared_ptr<const Foo> >
, вы можете легко создать его с shared_ptr
s с теми же элементами, что и оригинал:
std::vector<shared_ptr<Foo> > v;
std::vector<shared_ptr<const Foo> > cv(v.begin(), v.end());
Однако, если вы пишете свой код в терминах итераторов, у вас не должно возникнуть никаких проблем с этим. То есть вместо использования
void f(const std::vector<shared_ptr<const Foo> >&);
// used as:
std::vector<shared_ptr<const Foo> > v;
f(v);
вы должны использовать
template <typename ForwardIterator>
void f(ForwardIterator first, ForwardIterator last);
// used as:
std::vector<shared_ptr<const Foo> > v;
f(v.begin(), v.end());
Таким образом, функция f
просто требует, чтобы она получала диапазон вещей, которые можно использовать в качестве указателей на const Foo
(или shared_ptr<const Foo>
с, если функция предполагает, что диапазон содержит shared_ptr
с).
Когда функция принимает диапазон вместо контейнера, вы отделяете функцию от базовых данных: она больше не имеет значения, что это за данные на самом деле или как они хранятся, если вы можете использовать их так, как вы это делаете. нужно использовать.