Anda tidak akan mendapatkan banyak karena dalam ekspresi suka
int x = sto("1");
Tidak ada cara (mudah) untuk menyimpulkan tipe yang diinginkan untuk parameter template. Anda harus menulis
int x = sto<int>("1");
yang untuk beberapa memperpanjang kekalahan tujuan menyediakan fungsi generik. Di sisi lain, a
template<typename T>
void sto(std::string x,T& t);
akan bermanfaat jika Anda menyadari. Di C ++ 17 ada std::from_chars
, yang melakukan lebih atau kurang persis itu (itu bukan template tapi satu set kelebihan dan dibutuhkan pointer ke karakter bukan string, tapi itu hanya detail kecil).
PS
Tidak ada cara mudah untuk menyimpulkan jenis yang diinginkan dalam ekspresi di atas, tetapi ada cara. Saya tidak berpikir inti dari pertanyaan Anda persis tanda tangan yang Anda minta, dan saya tidak berpikir berikut ini adalah cara yang baik untuk mengimplementasikannya, tetapi saya tahu bahwa ada cara untuk membuat int x = sto("1");
kompilasi di atas dan saya ingin melihatnya dalam aksi.
#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;
}
Ini berfungsi sebagaimana dimaksud, tetapi memiliki kelemahan parah, mungkin yang paling penting itu memungkinkan untuk menulis auto x = sto(s);
, yaitu mudah digunakan salah.