В моем коде у меня есть 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>&
это.
В 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.
}
Обновлено в соответствии с рекомендациями в комментариях
Других решений пока нет …