Неявное преобразование векторак вектору> - PullRequest
4 голосов
/ 18 мая 2011

Согласно этой странице вы можете неявно конвертировать shared_ptr<Foo> в shared_ptr<const Foo>. Это имеет смысл.

Однако при попытке преобразовать std::vector, содержащий shared_ptr<Foo>, в shared_ptr<const Foo>.

я сталкиваюсь с ошибкой

Есть ли хороший способ добиться этого преобразования?

Ответы [ 3 ]

9 голосов
/ 18 мая 2011

Нет: 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 с).

Когда функция принимает диапазон вместо контейнера, вы отделяете функцию от базовых данных: она больше не имеет значения, что это за данные на самом деле или как они хранятся, если вы можете использовать их так, как вы это делаете. нужно использовать.

1 голос
/ 18 мая 2011

vector<TYPE> и vector<const TYPE> - это два разных типа. Так что без взлома или грязного кода это невозможно .

0 голосов
/ 18 мая 2011

Зачем вам нужен std::vector<shared_ptr<Foo const> >?Преобразование легко;просто используйте конструктор с двумя итераторами std::vector.Но во многих случаях вам это не понадобится: обычно правильность const не имеет значения для динамически размещаемых объектов, и если вам требуется shared_ptr<Foo const>, при извлечении объекта из вектора происходит автоматическое преобразование.*

...