Sie würden nicht viel gewinnen, weil in einem Ausdruck wie
int x = sto("1");
Es gibt keine (einfache) Möglichkeit, den gewünschten Typ für den Vorlagenparameter abzuleiten. Du müsstest schreiben
int x = sto<int>("1");
was in gewissem Maße den Zweck der Bereitstellung einer generischen Funktion zunichte macht. Auf der anderen Seite a
template<typename T>
void sto(std::string x,T& t);
wäre von Nutzen, wie Sie erkannt haben. In C ++ 17 gibt es etwas std::from_chars
, das mehr oder weniger genau das tut (es ist keine Vorlage, sondern eine Reihe von Überladungen, und es werden Zeiger auf Zeichen anstelle einer Zeichenfolge verwendet, aber das sind nur geringfügige Details).
PS
Es gibt keine einfache Möglichkeit, den gewünschten Typ im obigen Ausdruck abzuleiten, aber es gibt eine Möglichkeit. Ich glaube nicht, dass der Kern Ihrer Frage genau die Signatur war, nach der Sie gefragt haben, und ich denke nicht, dass das Folgende eine gute Möglichkeit ist, sie zu implementieren, aber ich wusste, dass es eine Möglichkeit gibt, die oben genannten zu int x = sto("1");
kompilieren, und ich war neugierig, sie zu sehen in Aktion.
#include <iostream>
#include <string>
struct converter {
const std::string& x;
template <typename T> operator T() { return 0;}
};
template <> converter::operator int() { return stoi(x); }
template <> converter::operator double() { return stod(x); }
converter sto(const std::string& x) { return {x}; }
int main() {
std::string s{"1.23"};
int x = sto(s);
double y = sto(s);
std::cout << x << " " << y;
}
Dies funktioniert wie beabsichtigt, hat aber schwerwiegende Nachteile, vielleicht am wichtigsten ist, dass es das Schreiben ermöglicht auto x = sto(s);
, dh es ist leicht falsch zu verwenden.