Mã đoạn mã từ lexical_cast:Kích hoạt lớp để sử dụng với boost :: lexical_cast
class lexical_castable {
public:
lexical_castable() {};
lexical_castable(const std::string s) : s_(s) {};
friend std::ostream operator<<
(std::ostream& o, const lexical_castable& le);
friend std::istream operator>>
(std::istream& i, lexical_castable& le);
private:
virtual void print_(std::ostream& o) const {
o << s_ <<"\n";
}
virtual void read_(std::istream& i) const {
i >> s_;
}
std::string s_;
};
std::ostream operator<<(std::ostream& o,
const lexical_castable& le) {
le.print_(o);
return o;
}
std::istream operator>>(std::istream& i, lexical_castable& le) {
le.read_(i);
return i;
}
Dựa trên document,
template<typename Target, typename Source>
Target lexical_cast(const Source& arg);
1> Trả về kết quả của luồng arg vào một thư viện chuẩn chuỗi dựa trên chuỗi và sau đó là đối tượng Mục tiêu.
2> Nguồn là OutputStreamable
3> Target là InputStreamable
Question1> Cần User Defined Type (UDT), nên các OutputStreamable hoặc InputStreamable luôn phải đối phó với std::string
? Ví dụ: cho một lớp có chứa một số nguyên đơn giản làm biến thành viên, khi chúng tôi xác định operator<<
và operator>>
, mã triển khai trông như thế nào? Tôi có phải chuyển đổi số nguyên thành chuỗi không? Dựa trên hiểu biết của tôi, có vẻ như UDT luôn phải đối phó với std::string
để làm việc với boost::lexical_cast
và boost::lexcial_cast
cần số trung gian std::string
để thực hiện các công việc chuyển đổi thực.
question2> Tại sao giá trị trả về của operator<<
hoặc operator>>
trong mã trên là không tham khảo để std::ostream&
hoặc std::istream&
tương ứng?
Mã không trả về tham chiếu rất có thể là lỗi, vì luồng không thể sao chép được. – Xeo
Đó là một lỗi mà 'lexical_castable :: read_' là một hàm thành viên const – q0987
Đó là một lỗi mà' lexical_castable :: print' bao gồm một '\ n'. – q0987