Вы не получите много, потому что в выражении, как
int x = sto("1");
Не существует (простого) способа определить требуемый тип для параметра шаблона. Вы должны написать
int x = sto<int>("1");
что в некоторой степени противоречит цели предоставления универсальной функции. С другой стороны,
template<typename T>
void sto(std::string x,T& t);
было бы полезно, как вы поняли. В C ++ 17 есть std::from_chars
, что делает более-менее точно (это не шаблон, а набор перегрузок, и он использует указатели на символы вместо строки, но это лишь незначительные детали).
PS
Нет простого способа вывести нужный тип в приведенном выше выражении, но есть способ. Я не думаю, что в основе вашего вопроса была именно та подпись, о которой вы просили, и я не думаю, что следующее является хорошим способом для ее реализации, но я знал, что есть способ сделать вышеупомянутую int x = sto("1");
компиляцию, и мне было любопытно увидеть ее в действии.
#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;
}
Это работает как задумано, но имеет серьезные недостатки, возможно, самое главное, что оно позволяет писать auto x = sto(s);
, то есть его легко использовать неправильно.