Рассмотрим следующий пример:
struct Scanner
{
template <typename T>
T get();
};
template <>
string Scanner::get()
{
return string("string");
}
template <>
int Scanner::get()
{
return 10;
}
int main()
{
Scanner scanner;
string s = scanner.get<string>();
int i = scanner.get<int>();
}
Класс Scanner
используется для извлечения токенов из какого-либо источника. Приведенный выше код работает нормально, но терпит неудачу, когда я пытаюсь get
использовать другие целочисленные типы, такие как char
или unsigned int
. Код для чтения этих типов точно такой же, как код для чтения int
. Я мог бы просто продублировать код для всех других интегральных типов, которые я хотел бы прочитать, но я бы предпочел определить один шаблон функции для всех целочисленных типов.
Я пробовал следующее:
struct Scanner
{
template <typename T>
typename enable_if<boost::is_integral<T>, T>::type get();
};
Это работает как шарм, но я не знаю, как заставить Scanner::get<string>()
снова работать. Итак, как мне написать код, чтобы я мог выполнять scanner.get<string>()
и scanner.get<any integral type>()
и иметь одно определение для чтения всех целочисленных типов?
Обновление: бонусный вопрос: что, если я захочу принять более одного диапазона классов на основе некоторых черт? Например: как мне подойти к этой проблеме, если я хочу иметь три функции get
, которые принимают (i) целочисленные типы (ii) типы с плавающей запятой (iii) строки соответственно.