Так как вектор resources
имеет тип Resource*
, если вы попытаетесь вставить что-то, что не является производным от Resource
, вы получите ошибку времени компиляции.
В противном случае вы можете SFINAE:
class ResourceManager{
private:
std::vector<Resource*> resources;
public:
template <typename T>
std::enable_if_t<std::is_base_of_v<Resource, T>, void> addResource(){
T* resource = new T;
resource->loadFromFile();
resources.push_back(resource);
}
}
Используйте SFINAE, только если вы хотите сделать что-то еще, если T
не является производным от Resource
, в противном случае вы можете полностью положиться на ошибку времени компиляции на resources.push_back(pointer)
РЕДАКТИРОВАТЬ: Фактически вы можете заставить T
быть производным от Resource
, используя систему типов:
void addResource(){
Respurce* resource = new T;
resource->loadFromFile();
resources.push_back(resource);
}
Но только если loadFromFile
объявлен в Resource
, а не в T
(т. ваш пример будет работать) (Спасибо @ RemyLebeau)