snippet di codice lexical_cast:Abilitazione Classi per l'utilizzo con 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;
}
Sulla base di document,
template<typename Target, typename Source>
Target lexical_cast(const Source& arg);
1> restituisce il risultato di streaming di arg in una libreria standard flusso basato su stringhe e quindi fuori come oggetto Target.
2> Source è OutputStreamable
3> Target è InputStreamable
Question1> Per User Defined Type (UDT), deve l'OutputStreamable o InputStreamable hanno sempre a che fare con std::string
? Ad esempio, data una classe contenente un numero intero semplice come variabile membro, quando definiamo lo operator<<
e operator>>
, come è il codice di implementazione? Devo convertire il numero intero come stringa? Sulla base della mia comprensione, sembra che l'UDT debba sempre occuparsi di std::string
per lavorare con boost::lexical_cast
e boost::lexcial_cast
e che abbia bisogno dello intermedio std::string
per eseguire i veri lavori di conversione.
Question2> Perché il valore di ritorno di operator<<
o operator>>
nel codice di cui sopra non è il riferimento rispettivamente std::ostream&
o std::istream&
?
Che il codice non restituisca un riferimento è molto probabile un bug, poiché gli stream non sono copiabili. – Xeo
È un errore che 'lexical_castable :: read_' è una funzione membro const – q0987
È un errore che' lexical_castable :: print' include un '\ n'. – q0987