使用显式实例化设置类模板的方法

时间:2010-08-20 19:44:10

标签: c++ templates explicit-specialization

在询问this question并大量阅读模板之后,我想知道以下类模板的设置是否有意义。

我有一个名为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

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

2 个答案:

答案 0 :(得分:3)

是。
这完全是合法的。

你可能想要隐藏它在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>;   

答案 1 :(得分:-2)

如果您需要不同的功能实现,根据类型,我建议使用继承而不是模板。

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

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

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