คุณจะไม่ได้รับมากเพราะในการแสดงออกเช่น
int x = sto("1");
ไม่มีวิธี (ง่าย) ในการอนุมานประเภทที่ต้องการสำหรับพารามิเตอร์เทมเพลต คุณจะต้องเขียน
int x = sto<int>("1");
ซึ่งบางคนขยายเอาชนะความมุ่งหมายของการให้ฟังก์ชั่นทั่วไป ในทางกลับกันก
template<typename T>
void sto(std::string x,T& t);
จะเป็นการใช้งานที่ดีตามที่คุณรับรู้ ใน C ++ 17 มีstd::from_chars
ซึ่งทำสิ่งนั้นอย่างมากหรือน้อยกว่านั้น (ไม่ใช่เทมเพลต แต่เป็นชุดของโอเวอร์โหลดและใช้พอยน์เตอร์ไปยังตัวอักษรแทนที่จะเป็นสตริง แต่นั่นเป็นเพียงรายละเอียดเล็กน้อยเท่านั้น)
ป.ล.
ไม่มีวิธีที่ง่ายในการอนุมานประเภทที่ต้องการในนิพจน์ด้านบน แต่มีวิธี ฉันไม่คิดว่าแก่นแท้ของคำถามของคุณเป็นลายเซ็นที่คุณถามและฉันไม่คิดว่าสิ่งต่อไปนี้เป็นวิธีที่ดีในการนำไปใช้ แต่ฉันรู้ว่ามีวิธีในการ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);
ได้เช่นมันใช้งานง่ายผิด