Вы не получите много, потому что в выражении типа
int x = sto("1");
Нет (простого) способа определить желаемый тип для параметра шаблона. Вам нужно было бы написать
int x = sto<int>("1");
, что в некоторой степени противоречит цели предоставления функции c. С другой стороны,
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);
, ie, это легко использовать неправильно.