Nie zyskałbyś wiele, ponieważ w takim wyrażeniu jak
int x = sto("1");
Nie ma (łatwego) sposobu, aby wydedukować pożądany typ parametru szablonu. Musisz pisać
int x = sto<int>("1");
co w pewnym stopniu przeczy celowi zapewnienia funkcji ogólnej. Z drugiej strony, a
template<typename T>
void sto(std::string x,T& t);
przyda ci się, jak sobie uświadomiłeś. W C ++ 17 jest to std::from_chars
, co robi mniej więcej dokładnie to (nie jest to szablon, ale zestaw przeciążeń i wymaga wskaźników do znaków zamiast łańcucha, ale to tylko drobne szczegóły).
PS
Nie ma łatwego sposobu, aby wydedukować pożądany typ w powyższym wyrażeniu, ale istnieje sposób. Nie sądzę, aby rdzeń twojego pytania był dokładnie podpisem, o który prosiłeś, i nie sądzę, że poniższy sposób jest dobrym sposobem na jego wdrożenie, ale wiedziałem, że istnieje sposób na int x = sto("1");
skompilowanie powyższego i byłem ciekawy to zobaczyć w akcji.
#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;
}
Działa to zgodnie z przeznaczeniem, ale ma poważne wady, być może co najważniejsze pozwala na pisanie auto x = sto(s);
, tzn. Jest łatwe w użyciu.