问之后 这个问题 并且在模板上阅读很多内容,我想知道类模板的以下设置是否有意义。

我有一个名为的类模板 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.
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top