Russian Qt Forum

Программирование => С/C++ => Тема начата: Racheengel от Декабрь 30, 2017, 21:21



Название: Тупой вопрос по касту элементов вектора.
Отправлено: Racheengel от Декабрь 30, 2017, 21:21
Всем привет,

вот такая задача под Новый Год:
передать в метод вектор типа std::vector<B*>, если сигнатура метода выглядит как setVector(std::vector<A*>), где A - суреркласс B.
Дополнительное условие: создание временного std::vector<A*> и поэлементного копирования в него элементов не разрешено ни в каком виде (ни явно, ни неявно).
Каковы идеи?


Название: Re: Тупой вопрос по касту элементов вектора.
Отправлено: Авварон от Декабрь 30, 2017, 21:44
Поменять сигнатуру на array_view<A> и конструировать array_view<A>(vec.data(), vec.size());


Название: Re: Тупой вопрос по касту элементов вектора.
Отправлено: Igors от Декабрь 31, 2017, 07:44
Сишный каст и все дела (нечего строить из себя целку)


Название: Re: Тупой вопрос по касту элементов вектора.
Отправлено: Авварон от Декабрь 31, 2017, 13:58
Почитал Гугл, мое решение с вью ничем не лучше. В общем случае, так делать нельзя, потому что указатели наследника и базового класса могут не совпадать, поэтому нужно копировать (а точнее, перевычислять адреса для каждого объекта)


Название: Re: Тупой вопрос по касту элементов вектора.
Отправлено: Igors от Декабрь 31, 2017, 14:17
Да, верно, при множ наследовании адреса могут быть разные, копирование неизбежно. Нечего было возвращать вектор указателей на наследника


Название: Re: Тупой вопрос по касту элементов вектора.
Отправлено: m_ax от Декабрь 31, 2017, 14:31
Продумывать нужно архитектуру перед тем как писать.
Сигнатуру метода нужно менять, чтоб он итераторы принимал:
Код
C++ (Qt)
template <class Iter>
void setVector(Iter first, Iter second)
 


Название: Re: Тупой вопрос по касту элементов вектора.
Отправлено: Racheengel от Декабрь 31, 2017, 15:48
Сигнатуру метода нужно менять, чтоб он итераторы принимал:

а чем это спасет то по сути?
в этом варианте придется делать новую имплементацию метода setVector в классе-наследнике, по сути будет то же копирование...


Название: Re: Тупой вопрос по касту элементов вектора.
Отправлено: Igors от Декабрь 31, 2017, 16:18
..по сути будет то же копирование...
И чем оно здесь плохо? Часто специально заряжают именно контейнер указателей (а не самих данных) чтобы развязаться с копированием, сортировкой и др.  А темплейты может есть смысл рисовать для создателя исходного вектора (чтоб  мог возвращать и так и сяк)


Название: Re: Тупой вопрос по касту элементов вектора.
Отправлено: _Bers от Январь 07, 2018, 18:32
Сишный каст и все дела (нечего строить из себя целку)
+1


Название: Re: Тупой вопрос по касту элементов вектора.
Отправлено: _Bers от Январь 07, 2018, 18:35
Продумывать нужно архитектуру перед тем как писать.
Сигнатуру метода нужно менять, чтоб он итераторы принимал:
Код
C++ (Qt)
template <class Iter>
void setVector(Iter first, Iter second)
 
+1