我的代码库中有几个“资源”。它们都是类,除了一个类外,共享相同的接口,ShaderProgram只有一个不同之处,它需要两个字符串作为顶点和片段文件的文件名。
我有一个名为 ResourceManager 的模板类,它处理除着色器一个之外的所有这些资源,因为它需要两个文件,而其他文件需要一个,我可以通过模板专业化解决这个问题吗?需要 ResourceManager 看到 GetOrLoadFromFile(string, string) 而不是 (string) 版本,而其他版本则相反,他们看到的是 (string) 而不是 (string, string)。AttemptLoad 也需要处理。我该如何解决这个问题,请包含代码,我以前从未做过模板专业化。
template < class ResType > class ResourceManager
{
public:
ResourceManager(void);
~ResourceManager(void);
SmartPointer<ResType> GetOrLoadFromFile( const std::string & fileName );
//weak_ptr<ResType> GetResourceFromID( ResourceID & resID );
void DestroyResources();
void ReleaseResources();
void ReloadResources();
protected:
private:
SmartPointer<ResType> AttemptLoad( const std::string & fileName );
std::unordered_map<string, SmartPointer<ResType> > mResMap;
};
// Relevant methods ( SNIPPED )
template < class ResType> SmartPointer<ResType> ResourceManager<ResType>::GetOrLoadFromFile( const std::string & fileName )
{
if ( !mResMap.empty() )
{
auto index = mResMap.begin();
auto end = mResMap.end();
while ( index != end )
{
if ( index->first == fileName )
{
return index->second;
}
++index;
}
}
return AttemptLoad(fileName);
}
template < class ResType > SmartPointer<ResType> ResourceManager<ResType>::AttemptLoad( const std::string & fileName )
{
SmartPointer<ResType> pRes( new ResType() );
if ( pRes->LoadFromFile( fileName ) )
{
mResMap.insert( std::make_pair( fileName, pRes ) );
return pRes;
}
else
{
LogFailure("Failed to load resource file " + fileName)
return SmartPointer<ResType>(nullptr);
}
}