Ви б не набрали багато, тому що в виразі, як
int x = sto("1");
Немає (простого) способу вивести потрібний тип для параметра шаблону. Вам би довелося писати
int x = sto<int>("1");
що певною мірою перемагає мету забезпечення родової функції. З іншого боку, a
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);
, тобто його легко використовувати неправильно.