Прежде всего, у вас есть проблема с синтаксисом:
template <typename T>
class Derived<T>: public Base { // Won't compile, the class name is Derived, and it doesn't suppose to get specialized by T type
};
Правильный путь:
template <typename T>
class Derived : public Base {};
Для вашей проблемы вам не нужно преобразовывать его обратно в производный типа, вам просто нужно сделать свой вектор вектором указателей на базовый класс (и в функции вставки принять производный тип в качестве ссылки, чтобы передать его адрес вектору).
Примечание: в реализации вы увидите, что я передал shared_ptr - чтобы сделать право собственности на адрес очевидным, когда вы используете shared_ptr вместо небезопасных указателей в своем векторе (спасибо @ idclev463035818 за примечание) .
class util {
public:
template <typename T>
void add(std::shared_ptr<Derived<T>> arg) {
vec.push_back(arg);
// vec.push_back(&arg); // In case that you don't use shared_ptr, and pass arg by reference.
}
void start() {
for (auto d : vec) { /* ... */ }
}
private:
// Idea: std::vector<Base*> vec;
std::vector<std::shared_ptr<Base>> vec; // For safe memory management
};