模板中的错误可能是错误的设计资源管理器
Error in templates in probably wrong designed resource manager
我正在创建我的第一个游戏。它将是Pacman或Snake。我将使用DirectX11。
目前我正在写资源经理。我想创建最简单的使用,但我认为它的设计不是很好。这是我写的:
#pragma once
class Shader;
class Mesh;
class Texture;
typedef std::map<std::string, std::auto_ptr<Shader>> shaders_map;
typedef std::map<std::string, std::auto_ptr<Mesh>> meshes_map;
typedef std::map<std::string, std::auto_ptr<Texture>> textures_map;
template<class C, class E>
inline int findElementInMap(const C& cont, E *ptr)
{
C::const_iterator it = cont.begin();
int i = 0;
while(it != cont.end())
{
if(it->second.get() == ptr) // ERROR AT THIS LINE!!!!
return i;
i++;
it++;
}
return -1;
}
class ResourceManager
{
public:
ResourceManager(void);
~ResourceManager(void);
template<class T>
inline T* get(const std::string &name)
{
if(typeid(T) == typeid(Shader)) {
return (T*)getShader(name);
}
else if(typeid(T) == typeid(Mesh)) {
return (T*)getMesh(name);
}
else if(typeid(T) == typeid(Texture)) {
return (T*)getTexture(name);
}
return nullptr;
}
Shader* getShader(const std::string &name);
Mesh* getMesh(const std::string &name);
Texture* getTexture(const std::string &name);
template<class T>
inline bool add(T *ptr)
{
if(typeid(T) == typeid(Shader)) {
return addShader((Shader*)((void*)ptr));
}
else if(typeid(T) == typeid(Mesh)) {
return addMesh((Mesh*)((void*)ptr));
}
else if(typeid(T) == typeid(Texture)) {
return addTexture((Texture*)((void*)ptr));
}
return false;
}
bool addShader(Shader *ptr);
bool addMesh(Mesh *ptr);
bool addTexture(Texture *ptr);
template<class E>
inline void release(E *ptr)
{
if(typeid(E) == typeid(Shader)) {
release<shaders_map, E>(shaders, (E*)((void*)ptr));
return;
}
else if(typeid(E) == typeid(Mesh)) {
release<meshes_map, E>(meshes, (E*)((void*)ptr));
return;
}
else if(typeid(E) == typeid(Texture)) {
release<textures_map, E>(textures, ptr);
}
}
// THIS METHOD CAUSES PROBLEM
template<class C, class E>
void release(C &container, E *ptr)
{
assert(ptr != nullptr);
int index = findElementInMap<C, E>(container, ptr);
if(index < 0)
return;
C::iterator it = container.begin();
it->second.release();
}
private:
shaders_map shaders;
meshes_map meshes;
textures_map textures;
};
现在编译错误:
error C2440: '==' : cannot convert from 'Shader *' to 'Mesh *'
int findElementInMap<C,E>(const C &,E *)' being compiled
with
[
C=textures_map,
E=Shader
]
因此,容器类型和元素类型不匹配。关于如何设置它的任何想法?
或我应该从头开始构建新的资源管理器?
编辑:这就是我使用此类的方式:
Shader *sh = new Shader();
resourceManager.add<Shader>(sh);
resourceManager.release<Shader>(sh);
多种方法。
您可以通过简单的过载来完成:
bool add(Shader *ptr){
return addShader(ptr);
}
bool add(Mesh *ptr){
return addMesh(ptr);
}
bool add(Texture *ptr){
return addTexture(ptr);
}
或如果要使用模板,只需进行添加并获取方法模板方法并专业化
template<class T>
void add(T *ptr){
}
和每种资源类型
template<>
ResourceManager<Texture>::add(Texture *ptr){
return addTexture(ptr);
}
template<>
ResourceManager<Shader>::add(Shader *ptr){
return addShader(ptr);
}
template<>
ResourceManager<Mesh>::add(Mesh *ptr){
return addMesh(ptr);
}
另一个清洁器选项是制作一个模板方法,该方法将返回目标容器
template<typename T>
std::map<std::string, std::auto_ptr<typename T> > &getContainer(){
}
专门将其返回给定类型
的良好容器template<>
std::map<std::string, std::auto_ptr<Mesh> > &ResourceManager::getContainer<Mesh>(){
return meshes_map;
}
template<>
std::map<std::string, std::auto_ptr<Texture> > &ResourceManager::getContainer<Texture>(){
return textures_map;
}
template<>
std::map<std::string, std::auto_ptr<Shader> > &ResourceManager::getContainer<Shader>(){
return shader_map;
}
这将使Get方法归结为:
template<typename T>
T* get(const std::string &name){
return getContainer<T>().get(name);
}
免责声明:这只是一个快速的,我没有编译。
关于您的汇编错误的编辑:您致电resourceManager.release<Shader>(sh);
对于图片,在发行方法中将E替换为着色器,您会发现它无法编译。释放(纹理,ptr)对于您的发布方法,您必须明确施放:
template<class E>
inline void release(E *ptr)
{
if(typeid(E) == typeid(Shader)) {
release<shaders_map, Shader>(shaders, (Shader*)((void*)ptr));
return;
}
else if(typeid(E) == typeid(Mesh)) {
release<meshes_map, Mesh>(meshes, (Mesh*)((void*)ptr));
return;
}
else if(typeid(E) == typeid(Texture)) {
release<textures_map, Texture>(textures, (Texture*)((void*)ptr));
}
}
相关文章:
- 如何维护资源管理器项目视图中当前可见的项目列表
- 编译器资源管理器和 GCC 具有不同的输出
- Windows 资源管理器中的图标在使用 resource.rc 时显示 2 个不同的图标
- 编译器资源管理器(godbolt)如何安全地运行代码?
- 从 GUI 文件资源管理器执行程序,并且不生成终端
- Visual Studio 测试资源管理器找不到我的提升测试
- 通过文件资源管理器获取文件夹目录
- Windows 资源管理器打开文件夹还原
- 如何使用C 浏览目录以创建文件资源管理器
- C++ Android 资源管理器从应用内部目录中读取文件
- 停止SetVolumeMountPoint打开文件资源管理器
- 重新启动资源管理器.exe使用 C++
- 资源管理器
- Visual Studio,在(解决方案资源管理器的)某个筛选器内的所有文件中查找/替换文本
- SHOpenFolder并选择资源管理器更换程序的项目
- 如何在 Windows 资源管理器中捕获用户的左键单击?
- 如何将设备隐藏在资源管理器中
- 资源管理器在 TILE 视图模式下不显示 shell 命名空间扩展的项目详细信息
- 模板中的错误可能是错误的设计资源管理器
- 在XP上使用windows文件资源管理器时,停止打开explorer.exe任务栏