Как я могу написать шаблон функции для всех типов с определенной чертой типа?
Рассмотрим следующий пример:
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) строки, соответственно.