Non guadagneresti molto perché in un'espressione simile
int x = sto("1");
Non esiste un modo (semplice) per dedurre il tipo desiderato per il parametro template. Dovresti scrivere
int x = sto<int>("1");
che in qualche misura sconfigge lo scopo di fornire una funzione generica. D'altra parte, a
template<typename T>
void sto(std::string x,T& t);
sarebbe utile come ti sei reso conto. In C ++ 17 c'è std::from_chars
, che fa più o meno esattamente quello (non è un modello ma un insieme di sovraccarichi e prende puntatori ai caratteri anziché a una stringa, ma sono solo dettagli minori).
PS
Non esiste un modo semplice per dedurre il tipo desiderato nell'espressione sopra, ma esiste un modo. Non penso che il nocciolo della tua domanda sia esattamente la firma che hai chiesto, e non credo che il seguente sia un buon modo per implementarlo, ma sapevo che esiste un modo per compilare la int x = sto("1");
compilazione sopra ed ero curioso di vederlo in azione.
#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;
}
Funziona come previsto, ma ha gravi svantaggi, forse soprattutto consente di scrivere auto x = sto(s);
, cioè è facile da usare in modo errato.