2

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

我有一个名为的类模板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

简而言之,我试图找到最简洁的方法来处理声明和定义模板类及其方法,其中一些可能是显式的特化。这是一种特殊情况,我知道只会使用一些显式实例化。

4

2 回答 2

3

是的。
这是完全合法的。

您可能希望隐藏它在 typedef 后面模板化的事实(如 std::basic_string 所做的那样),然后在标题中添加注释以不显式使用模板。

资源管理器.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;

资源管理器.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>;   
于 2010-08-20T20:47:02.610 回答
-2

如果您需要不同的函数实现,具体取决于类型,我建议使用继承而不是模板。

class ResourceManager {
    // Virtual and non-virtual functions.
}

class ImageManager : public ResourceManager {
    // Implement virtual functions.
}

class MusicManager : public ResourceManager {
    // Implement virtual functions.
}
于 2010-08-20T19:55:02.667 回答