Подтвердить что ты не робот

С++ Как передать список не-consts функции, требующей список consts

У меня есть функция с сигнатурой

void Foo(list<const A*>)

и я хочу передать ему

list<A*>

Как мне это сделать? (примечание PLZ - список не является постоянным, только членом списка)

4b9b3361

Ответ 1

Проблема заключается в том, что даже если T * может быть неявно преобразован в T const *, система шаблонов не "осведомлена" об этом, поэтому whatever<T *> и whatever<T const *> являются полностью несвязанными типами, и нет никакого неявного преобразования от одного к другому.

Чтобы избежать этой проблемы, я бы, вероятно, вообще не пропускал коллекцию. Вместо этого у меня была бы функция взять пару итераторов. A list<A *>::iterator может быть неявно преобразован в list<A *>::const_iterator. В этом случае я, вероятно, сделаю функцию шаблоном, поэтому он может принимать итераторы произвольного типа.

Это, скорее всего, избавит вас от неприятностей - list редко бывает хорошим выбором контейнера, поэтому есть очень большой шанс, что когда-нибудь вы захотите перейти от list<A *> в vector<A *> или, возможно, deque<A *> - и если вы создадите свою общую функцию, вы сможете это сделать без перезаписи функции вообще.

Ответ 2

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

list<A*> list1;
list<const A*> list2;
for(list<A*>::iterator a=list1.begin(); a!=list1.end(); a++) list2.push_back(*a);

Ответ 3

Вам нужно будет создать копию списка - это аргумент pass-by-value. Там довольно простой способ создать копию, поскольку типы элементов имеют неявное преобразование: все контейнеры STL могут быть созданы из пары итераторов. Итак, в вашем случае:

std::list<A*> src;
Foo(std::list<const A*>(src.begin(), src.end()));

Это немного сложнее, чем нужно, потому что STL представляет диапазоны как пары итераторов, а правила преобразования С++ работают с одиночными объектами.

Ответ 4

Я считаю, что вы можете передать его так, как есть. Помните, что не-const-типы могут быть переданы чему-то, ожидающему тип const, но не наоборот!