Я работаю над менеджером ресурсов для своего игрового движка, и для добавления нового актива требуется несколько повторений. Требуется 4 вещи: контейнер, функция загрузки и две функции получения, поэтому для 4 ресурсов (например, сетка, текстура, Шейдер, Аудио) — это 16 вещей, которые нужно добавить. Я не думаю, что я могу что-то сделать с функциями загрузки, но с другой стороны, функции получения, по сути, такие же: они ищут карту с заданным дескриптором и возвращают актив. Я предполагаю, что с помощью шаблонов и/или наследования я мог бы просто получить общие функции получения, которые работают для любого ресурса. У меня нет большого опыта работы с ними, поэтому не очень очевидно, как я могу это реорганизовать.
struct ResourceHandle {
unsigned int id;
bool valid;
};
struct Mesh {
std::vector vertices;
unsigned int vao, vbo;
};
struct MeshMeta {
ResourceHandle handle;
std::string filepath;
time_t lastModifiedTime;
};
namespace ResourceManager {
namespace {
std::unordered_map meshes;
std::unordered_map textures;
std::unordered_map shaders;
}
void ReloadResources() {}
// Instead of this
ResourceHandle LoadMesh() {}
MeshMeta GetMesh(ResourceHandle handle) {}
ResourceHandle GetMesh(const std::string& filepath) {}
ResourceHandle LoadTexture() {}
TextureMeta GetTexture(ResourceHandle handle) {}
ResourceHandle GetTexture(const std::string& filepath) {}
ResourceHandle LoadShader() {}
ShaderMeta GetShader(ResourceHandle handle) {}
ResourceHandle GetShader(const std::string& filepath) {}
// It would just be
ResourceHandle LoadMesh() {}
ResourceHandle LoadTexture() {}
ResourceHandle LoadShader() {}
ResourceMeta GetResource(ResourceHandle handle) {}
ResourceHandle GetResource(const std::string& filepath) {}
}
Подробнее здесь: https://stackoverflow.com/questions/781 ... and-or-oop