gpt4 book ai didi

c++ - 这可以通过模板特化来解决吗,如果不能,那怎么办?

转载 作者:行者123 更新时间:2023-11-28 07:29:02 25 4
gpt4 key购买 nike

我的代码库中有几个“资源”。它们都是类并且共享相同的接口(interface),除了一个类,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);
}
}

最佳答案

如果这两个类都在您的控制之下,我会建议一个不同的解决方案。为什么不将 AttempLoad 方法更改为类似的方法

SmartPointer<ResType> AttemptLoad( const LoadConfiguration &p_loadConfiguration );

在哪里

class LoadConfiguration 
{
public:
std::string FirstFileName;
};

class ExtendedLoadConfiguration : public  LoadConfiguration 
{
public:
std::string SecondFileName;
};

然后您可以始终使用 LoadConfiguration,并且每个 AttemptLoad 都能够获取他需要的内容。添加新参数将很容易,具有相同签名的代码更少,而且您不必使用模板特化。

关于c++ - 这可以通过模板特化来解决吗,如果不能,那怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18086860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com