No ganarías mucho porque en una expresión como
int x = sto("1");
No hay forma (fácil) de deducir el tipo deseado para el parámetro de plantilla. Tendrias que escribir
int x = sto<int>("1");
que en cierta medida derrota el propósito de proporcionar una función genérica. Por otro lado, un
template<typename T>
void sto(std::string x,T& t);
sería de gran utilidad como te diste cuenta. En C ++ 17 existe std::from_chars
, que hace más o menos exactamente eso (no es una plantilla sino un conjunto de sobrecargas y toma punteros a caracteres en lugar de una cadena, pero eso son solo detalles menores).
PD
No hay una manera fácil de deducir el tipo deseado en la expresión anterior, pero hay una manera. No creo que el núcleo de su pregunta sea exactamente la firma que solicitó, y no creo que la siguiente sea una buena manera de implementarla, pero sabía que hay una manera de hacer la int x = sto("1");
compilación anterior y tenía curiosidad por verla. en acción.
#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;
}
Esto funciona según lo previsto, pero tiene graves inconvenientes, quizás lo más importante es que permite escribir auto x = sto(s);
, es decir, es fácil de usar incorrectamente.