Bạn sẽ không đạt được nhiều vì trong một biểu thức như
int x = sto("1");
Không có cách nào (dễ dàng) để suy ra loại mong muốn cho tham số mẫu. Bạn sẽ phải viết
int x = sto<int>("1");
mà một số mở rộng đánh bại mục đích cung cấp một chức năng chung. Mặt khác, một
template<typename T>
void sto(std::string x,T& t);
sẽ được sử dụng tốt như bạn nhận ra. Trong C ++ 17 std::from_chars
, có ít nhiều chính xác điều đó (nó không phải là khuôn mẫu mà là một tập hợp quá tải và nó đưa con trỏ tới ký tự thay vì một chuỗi, nhưng đó chỉ là chi tiết nhỏ).
PS
Không có cách dễ dàng để suy ra loại mong muốn trong biểu thức trên, nhưng có một cách. Tôi không nghĩ cốt lõi câu hỏi của bạn chính xác là chữ ký mà bạn đã yêu cầu và tôi không nghĩ sau đây là một cách tốt để thực hiện nó, nhưng tôi biết rằng có một cách để int x = sto("1");
biên dịch ở trên và tôi tò mò muốn xem trong hành động.
#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;
}
Điều này hoạt động như dự định, nhưng nó có nhược điểm nghiêm trọng, có lẽ quan trọng nhất là nó cho phép viết auto x = sto(s);
, tức là nó dễ sử dụng sai.