Ativando classes para uso com boost :: lexical_cast
Snippet de código de 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;
}
Baseado emdocument,
template<typename Target, typename Source>
Target lexical_cast(const Source& arg);
1> Retorna o resultado do streaming de arg em um fluxo baseado em string da biblioteca padrão e depois sai como um objeto Targe
2> A fonte é OutputStreamable
3> O destino é InputStreamable
Questão > Para o Tipo Definido pelo Usuário (UDT), o OutputStreamable ou InputStreamable sempre deve lidar comstd::string
? Por exemplo, dada uma classe que contém um número inteiro simples como variável de membro, quando definimos ooperator<<
eoperator>>
, como é o código de implementação? Preciso converter o número inteiro como uma string? Com base no meu entendimento, parece que a UDT sempre tem que lidar comstd::string
para trabalhar comboost::lexical_cast
eboost::lexcial_cast
precisa do intermediáriostd::string
para realizar os trabalhos de conversão reai
Questão > Por que o valor de retorno deoperator<<
ouoperator>>
no código acima não é referência astd::ostream&
oustd::istream&
respectivamente?