fragmento de código lexical_cast:Habilitación de las clases para su uso con impulso :: 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;
}
Basado en document,
template<typename Target, typename Source>
Target lexical_cast(const Source& arg);
1> devuelve el resultado de la transmisión de arg en una biblioteca estándar secuencia basada en cadena y luego fuera como un objeto Target.
2> Fuente es OutputStreamable
3> Objetivo es InputStreamable
Pregunta1> Por tipo definido por el usuario (UDT), si el OutputStreamable o InputStreamable siempre tienen que tratar con std::string
? Por ejemplo, dada una clase que contiene un entero simple como variable miembro, cuando definimos operator<<
y operator>>
, ¿cómo se ve el código de implementación? ¿Tengo que convertir el número entero como una cadena? En mi entender, parece que UDT siempre tiene que tratar con std::string
para trabajar con boost::lexical_cast
y boost::lexcial_cast
necesita el intermedio std::string
para realizar las tareas de conversión reales.
Pregunta2> ¿Por qué el valor de retorno de operator<<
o operator>>
en el código anterior no se hace referencia a std::ostream&
o std::istream&
, respectivamente?
Que el código no devuelve una referencia es muy probable que sea un error, ya que las transmisiones no se pueden copiar. – Xeo
Es un error que 'lexical_castable :: read_' es una función de miembro constante – q0987
Es un error que' lexical_castable :: print' incluye un '\ n'. – q0987