Çok kazanamazsınız çünkü
int x = sto("1");
Template parametresi için istenen türü çıkarmanın (kolay) bir yolu yoktur. Yazmak zorunda kalacaksın
int x = sto<int>("1");
ki bu bir dereceye kadar genel bir işlev sağlama amacını bozar. Öte yandan,
template<typename T>
void sto(std::string x,T& t);
farkettiğiniz gibi faydalı olacaktır. C ++ 17'destd::from_chars
, az çok tam olarak bunu yapar (bir şablon değil, aşırı yükler kümesidir ve bir dize yerine karakterlere işaretçiler alır, ancak bu sadece küçük detaylar).
PS
Yukarıdaki ifadede istenen tipin çıkarılmasının kolay bir yolu yoktur, ancak bir yolu vardır. Sorunuzun özünün tam olarak istediğiniz imza olduğunu düşünmüyorum ve aşağıdakilerin bunu uygulamak için iyi bir yol olduğunu düşünmüyorum, ancak yukarıdaki int x = sto("1");
derlemeyi yapmanın bir yolu olduğunu biliyordum ve görmeyi merak ettim eylem.
#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;
}
Bu amaçlandığı gibi çalışır, ancak ciddi dezavantajları vardır, belki de en önemlisi yazmaya izin verir auto x = sto(s);
, yani yanlış kullanımı kolaydır.