Приведите Q-список производных к Q-списку базы

#c #qt

Вопрос:

У меня есть эти занятия:

 class IParameter {}; class ModuleParameter : public IParameter {};  

Теперь у меня есть QList производных:

 QListlt;ModuleParameter*gt; list;  

Когда я бросаю один предмет, все в порядке:

 IParameter *p = list[0]; // ok  

Когда я составляю список, у меня возникает ошибка.

 QListlt;IParameter*gt; *list = static_castlt;QListlt;IParameter*gt;*gt;(amp;list);  

Invalid static_cast from type QListlt;ModuleParameter*gt;* to type QListlt;IParameter*gt;* .

Итак, как я могу бросить?

Комментарии:

1. рассмотрим std::копирование или std::преобразование

Ответ №1:

Если вам действительно нужен QListlt;IParameter*gt;, вы можете сделать что-то вроде этого:

 QListlt;A*gt; la;  QListlt;B*gt; lb;  ...  std::transform(lb.cbegin(),  lb.cend(),  std::back_inserter(la),  [=](B* b)  {  return static_castlt;A*gt;(b);  });  

Комментарии:

1. Этот код создает копию, но возможен ли кастинг?

2. Нет, как и сказал Свифт, QListlt;A*gt; и QListlt;B*gt; это два разных типа.

3. @maestro casting также создает копию. Приведение указателя небезопасно, и допускается только переосмысление).

4. Они рефакторировали QList в последних версиях Qt? раньше в нем не было cbegin/cend, но было перегружено начало/конец и некоторые проблемы с итерацией.

Ответ №2:

QList является шаблоном без общего базового типа класса и QListlt;ModuleParameter*gt; не имеет отношения к QListlt;IParameter*gt; типу , к которому вы не можете QListlt;ModuleParameter*gt; получить полиморфный доступ с помощью указателя QListlt;IParameter*gt; . То, что вы пытаетесь сделать, невозможно сделать таким образом.

Вместо этого вы можете хранить указатели на ModuleParameter in QListlt;IParameter*gt; и использовать приведение при доступе к ним.

Комментарии:

1. Итак, все ли, что вы изложили, подходит для любого класса шаблонов?

2. @maestro Это для любого типа. Тип, созданный шаблоном с уникальным набором аргументов шаблона, является уникальным типом (сам шаблон не является типом). можно создать шаблон, который был бы статически или динамически полиморфным, но для этого требуется наследование, а QList-это не так.