Передать вектор базового класса в функцию, которая принимает вектор суперкласса

В моем коде у меня есть SuperType который имеет два подтипа … теперь у меня есть std::vector<SubTypeA>& и нужно передать это в функцию, которая перебирает вектор и вызывает только функции от SuperType … Мне нужно сделать это с обоими подтипами.

(Супертип еще не является виртуальным, но в какой-то момент мне нужно сделать его виртуальным, потому что это просто общая часть двух подтипов, и не может быть его экземпляра)

Вот минимальный (не) рабочий пример:

#include <vector>
struct Super {
// stuff and functions
};
struct SubTypeA : public Super {
// stuff and functions
};

void func(const std::vector<Super>& sup) {
for (auto& elem: sup) {
// do things
}
return;
}

int main() {
std::vector<SubTypeA> v; // I get this from another place
std::vector<SubTypeA>& my_variable = v; // this is what I have in my code
func(my_variable); // does not work.
}

Передача итератора также была бы решением.


Sidenote: я получаю my_variable из другого типа:

struct SomeContainer {
std::vector<SubTypeA> a;
std::vector<SubTypeB> b;
}

И я не хотел бы менять контейнер, поэтому std::vector<SubTypeA>& это.

0

Решение

В c ++ ссылки и указатели типов Super а также SubTypeA ковариантны, но std::vector<Super> а также std::vector<SubTypeA> не. Вы можете использовать вектор указателей или ссылки на базовый класс для достижения того, что вы хотите:

#include <vector>
struct Super {
// stuff and functions
};
struct SubTypeA : public Super {
// stuff and functions
};

void func(std::vector<std::reference_wrapper<Super>>& sup) {
for (Super& elem: sup) {
// do things
}
return;
}

int main() {
std::vector<SubTypeA> v; // I get this from another place
// using vector of references to base class
std::vector<std::reference_wrapper<Super>> my_variable(v.begin(), v.end());

func(my_variable); // does not work.
}

Обновлено в соответствии с рекомендациями в комментариях

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]