Tôi muốn tạo một hàm chung cho std :: stoi, std :: stof, std :: stod vv .. như:Chức năng chung cho một họ các hàm liên quan (ví dụ: std :: stoi, std :: stof, std :: stod, v.v.)
// std::string -> int
std::string str = "1000000";
int i = to_numeric<int>(str);
// std::string -> long
std::string str = "100000000000";
long i = to_numeric<long>(str);
// std::string -> float
std::string str = "10000.1";
float i = to_numeric<float>(str);
Nhưng tôi không biết làm thế nào để làm cho chuyên môn hóa từng phần:
template<class T>
int to_numeric(const std::string &str, size_t *pos = 0, int base = 10) {
return std::stol(str, pos, base);
};
template<>
long to_numeric<long>(const std::string &str, size_t *pos, base) {
return std::stol(str, pos, base);
};
template<>
float to_numeric<float>(const std::string &str, size_t *pos) {
return std::stof(str, pos);
};
// .....
lỗi:
to_numeric.cpp:76:79: error: default argument specified in explicit specialization [-fpermissive]
to_numeric.cpp:76:12: error: template-id 'to_numeric<float>' for 'float to_numeric(const string&, size_t*)' does not match any template declaration
make: *** [build] Error 1
Tôi chỉ sử dụng 'boost :: lexical_cast'. – chris
Tôi không có Boost, nhưng tôi đã C++ 11 với cùng chức năng – Robbin
Vì bạn cần phải xác định loại mục tiêu, tại sao phải bận tâm? Đối với các hàm chung, có người dùng chuyển một cuộc gọi lại thực hiện chuyển đổi, có thể là 'std :: stoi' và family. Ngoài ra, vì điều này không rõ ràng về một tính năng C++ 11 (bạn chỉ cần sử dụng một trong việc thực hiện, nhưng bạn có thể gọi bất cứ điều gì khác là tốt), tôi đã chỉnh sửa các thẻ. – Xeo