2017-02-22 23 views
0

У меня есть класс со статической константной переменной, который мне нужно инициализировать по-разному в зависимости от типа переменной в параметре шаблона. Есть ли способ сделать это без специализации?Инициализация переменной в зависимости от типа в параметре шаблона в C++

В моем заголовочном файле у меня есть:

template<class Item> 
class CircularQueue { 
public: 
    static const Item EMPTY_QUEUE; 
    ... 

Попытка инициализировать его в файле .cpp:

template<typename Item> const Item CircularQueue<Item>::EMPTY_QUEUE = Item("-999"); 

Я хотел бы, чтобы инициализировать до -999 будь то ИНТ, double или string, но в приведенном выше коде я получаю «cast from» const char 'to' int 'теряет точность [-fpermissive] ".

+0

Может создать шаблонный помощник инициализации, которые могут быть специализированы вместо этого. 'template class Initializer {...};' –

+0

Нет, вам нужна специализация. Вам не нужно специализировать весь шаблон шаблона 'CircularQueue', но вы можете использовать отдельный специализированный вспомогательный класс для инициализации' EMPTY_QUEUE'. –

ответ

1

Предоставление примера использования отдельного вспомогательного класса, который может быть специализированным, вместо того, чтобы специализировать весь этот класс шаблонов, поскольку вы упомянули, что хотите увидеть пример этого подхода.

Просто объявите отдельный класс шаблонов, который устанавливает значение по умолчанию и специализируется на std::string.

template<class Item> class defaultItem { 

public: 

    static constexpr Item default_value() { return -999; } 
}; 

template<> class defaultItem<std::string> { 

public: 
    static constexpr const char *default_value() { return "-999"; } 
}; 

Вы не должны использовать constexpr ключевое слово, если C++ компилятор не из недавнего урожая. Вы также можете определить ту же специализацию для const char *, а не std::string, если необходимо.

Тогда ваш главный класс просто определяет EMPTY_QUEUE как:

template<typename Item> 
const Item CircularQueue<Item>::EMPTY_QUEUE = 
      defaultItem<Item>::default_value();