Vous ne gagneriez pas grand-chose car dans une expression comme
int x = sto("1");
Il n'existe aucun moyen (facile) de déduire le type souhaité pour le paramètre de modèle. Il faudrait écrire
int x = sto<int>("1");
qui dans une certaine mesure va à l'encontre de l'objectif de fournir une fonction générique. D'un autre côté, un
template<typename T>
void sto(std::string x,T& t);
serait d'une grande utilité comme vous vous en êtes rendu compte. En C ++ 17 il y en a std::from_chars
, qui fait plus ou moins exactement cela (ce n'est pas un modèle mais un ensemble de surcharges et il prend des pointeurs vers des caractères au lieu d'une chaîne, mais ce ne sont que des détails mineurs).
PS
Il n'y a pas de moyen facile de déduire le type souhaité dans l'expression ci-dessus, mais il y en a un. Je ne pense pas que le cœur de votre question était exactement la signature que vous avez demandée, et je ne pense pas que ce qui suit est un bon moyen de le mettre en œuvre, mais je savais qu'il existe un moyen de faire la int x = sto("1");
compilation ci-dessus et j'étais curieux de le voir en action.
#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;
}
Cela fonctionne comme prévu, mais il présente de graves inconvénients, ce qui est peut-être le plus important, il permet d'écrire auto x = sto(s);
, c'est-à-dire qu'il est facile à mal utiliser.