Способ настроить шаблон класса с явными экземплярами - PullRequest
2 голосов
/ 20 августа 2010

Задав этот вопрос и много читая о шаблонах, мне интересно, имеет ли смысл следующая настройка для шаблона класса.

У меня есть шаблон класса с именем 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 ]

3 голосов
/ 21 августа 2010

Да.
Это совершенно законно.

Возможно, вы захотите скрыть тот факт, что он шаблонизирован за 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 голосов
/ 20 августа 2010

Если вам требуются разные реализации функций в зависимости от типа, я бы рекомендовал использовать наследование вместо шаблонов.

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

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

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