Как я могу написать шаблон функции для всех типов с определенной чертой типа?

Рассмотрим следующий пример:

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) строки, соответственно.

Ответы на вопрос(2)

Ваш ответ на вопрос