Работая над системой импорта данных, я решил сохранить множество объектов, производных от одного класса, в векторе указателей на родительский класс. И затем я хотел бы иметь функцию, которая возвращает вектор любого типа дочерних указателей (используя параметры, которые позволяют мне знать, что это за дочерний элемент).
Мне удалось реализовать подобный и упрощенный код здесь, но он использует шаблоны и приведение, и я чувствую, что только приведений может быть достаточно. Однако компилятор не хочет выполнять преобразование из вектора A * в вектор B *.
РЕДАКТИРОВАТЬ: В реальном коде есть много дочерних классов, не только B, поэтому замена шаблона на B не вариант, извините за недостаточную точность.
#include <vector>
using namespace std;
class A
{
public:
int attr;
A(): attr(1) {}
};
class B : public A
{
public:
B(): A() {attr = 2;}
};
template <typename O>
vector<O*> bees(vector<A*> vecA)
{
auto vecO = vector<O*>();
for (auto it = vecA.begin(); it != vecA.end(); it++)
{
if ((*it)->attr == 2)
{
vecO.push_back(reinterpret_cast<O*>(*it));
}
}
return vecO;
}
int main()
{
auto vecA = vector<A*>();
vecA.push_back(new A());
vecA.push_back(new B());
vecA.push_back(new B());
vector<B*> vecB = bees<B>(vecA);
}
Итак, мой вопрос: возможно ли, чтобы код делал такой же эффект без использования шаблонов? А если нет, то компилятор генерирует определенный код с этим? Знание, что теоретически не будет никакой разницы во времени выполнения, независимо от шаблона.
Спасибо.