2010-08-20 57 views
2

在询问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 

总之,我试图找出处理声明和定义模板类的清洁方式其方法,其中一些可能是明确的专业化。这是一个特例,我知道只会使用一些明确的实例。

回答

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>; 
+0

谢谢!很有帮助。 – rhubarb 2010-08-20 21:18:45

-2

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

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

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

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

没有。重点是将类模板函数的定义放在头文件中没有#include的.cpp文件中(通常是在头文件中定义模板函数)。除非明确指定类模板的特化,否则这不起作用。事实上,只有一个功能实际上需要专门化。 – rhubarb 2010-08-20 20:10:21