【发布时间】:2014-07-26 20:52:08
【问题描述】:
我正在编写一个游戏,我使用了一个 ResourceHolder 模板类,它提供了加载和访问资源(纹理、音乐、字体...)的功能。它适用于 Texture 或 Font 类,因为它们具有相同的加载接口(它们的函数称为“loadFromFile”),但 Music 类的工作方式有点不同,它有一个“openFromFile”函数(我使用一个名为 SFML 的库) .
template <typename Resource, typename Identifier>
void ResourceHolder<Resource, Identifier>::load(Identifier id,
const std::string & fileName)
{
std::unique_ptr<Resource> resource(new Resource());
resource->loadFromFile(fileName);
}
我尝试了 if-else 方法:
if (typeid(id).name() == "Resources::MusicType")
resource->openFromFile(fileName);
else
resource->loadFromFile(fileName);
但是编译器在编译模板的 Texture 版本时会抛出一个错误,因为它没有 openFromFile 方法。我还考虑过将该函数作为第三个模板参数传递,但我想知道是否有更好的解决方案。谢谢。
【问题讨论】:
-
您可以为
Resources::MusicType创建部分特化。 -
与check-for-a-functions-existence相关,如果测试是基于方法的存在而不是类型。
-
谢谢大家,我选择了模板专业化方式,因为在这种情况下它似乎是最直接的方式。