使用显式实例设置类模板的方法
-
30-09-2019 - |
题
问之后 这个问题 并且在模板上阅读很多内容,我想知道类模板的以下设置是否有意义。
我有一个名为的类模板 ResourceManager
这只会加载一些特定资源 ResourceManager<sf::Image>
, ResourceManager<sf::Music>
, 等等。显然,我在ResourceManager.h中定义了类模板。但是,由于只有少数明确的实例,因此做类似...
// ResourceManager.cpp
template class ResourceManager<sf::Image>;
template class ResourceManager<sf::Music>;
...
// Define methods in ResourceManager, including explicit specializations
简而言之,我试图找到处理声明和定义模板类及其方法的最清洁方法,其中一些可能是明确的专业。这是一种特殊情况,我知道只会使用一些明确的实例。
解决方案
是的。
这是完美的legittamate。
您可能需要隐藏一个事实,即它在Typedef后面被模板(例如STD :: BASIC_STRING确实),然后在标题中注释,以免明确使用模板。
ResourceManager.H
template<typename T>
class ResourceManager
{
T& getType();
};
// Do not use ResourceManager<T> directly.
// Use one of the following types explicitly
typedef ResourceManager<sf::Image> ImageResourceManager;
typedef ResourceManager<sf::Music> MusicResourceManager;
ResourceManager.cpp
#include "ResourceManager.h"
// Code for resource Manager
template<typename T>
T& ResourceManager::getType()
{
T newValue;
return newValue;
}
// Make sure only explicit instanciations are valid.
template class ResourceManager<sf::Image>;
template class ResourceManager<sf::Music>;
其他提示
如果您需要不同的功能实现,具体取决于类型,我建议使用继承而不是模板。
class ResourceManager {
// Virtual and non-virtual functions.
}
class ImageManager : public ResourceManager {
// Implement virtual functions.
}
class MusicManager : public ResourceManager {
// Implement virtual functions.
}
不隶属于 StackOverflow