Wie kann ich eine Funktionsvorlage für alle Typen mit einem bestimmten Typmerkmal schreiben?

Betrachten Sie das folgende Beispiel:

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>();
}

DasScanner Klasse wird verwendet, um Token aus einer Quelle zu extrahieren. Der obige Code funktioniert einwandfrei, schlägt jedoch fehl, wenn ich es versucheget andere integrale Typen wie achar oder einunsigned int. Der Code zum Lesen dieser Typen ist genau der gleiche wie der Code zum Lesen einesint. Ich könnte den Code für alle anderen Integraltypen, die ich lesen möchte, einfach duplizieren, aber ich würde lieber eine Funktionsvorlage für alle Integraltypen definieren.

Ich habe Folgendes versucht:

struct Scanner
{
    template <typename T>
    typename enable_if<boost::is_integral<T>, T>::type get();
};

Was wie ein Zauber wirkt, aber ich bin mir nicht sicher, wie ich es bekommen sollScanner::get<string>() wieder funktionieren. Also, wie kann ich Code schreiben, damit ich tun kannscanner.get<string>() undscanner.get<any integral type>() und haben eine einzige Definition, um alle integralen Typen zu lesen?

Update: Bonusfrage: Was ist, wenn ich mehrere Klassen annehmen möchte, die auf bestimmten Merkmalen basieren? Zum Beispiel: Wie soll ich dieses Problem angehen, wenn ich drei haben möchte?get Funktionen, die (i) Integraltypen (ii) Gleitkommatypen (iii) Strings akzeptieren.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage