É possível obter o lançamento automático do tipo definido pelo usuário para STD :: String usando o cout?
-
25-09-2019 - |
Pergunta
Como na pergunta, se eu definir um operador de string na minha classe:
class Literal {
operator string const () {
return toStr ();
};
string toStr () const;
};
E então eu uso:
Literal l1 ("fa-2bd2bc3e0");
cout << (string)l1 << " Declared" << endl;
Com um elenco explícito, tudo vai certo, mas se eu remover a (string), o compilador diz que precisa de um operador de elenco declarado em STD :: string. Não deveria lançar meu tipo automaticamente? Resolvido: estou sobrecarregando o operador << (Ostream & OS, const literal & l).
Solução
Não .. STD :: String teria que ter um construtor que levasse literal como um argumento.
O que você poderia fazer é sobrecarregar o operador << para sua aula literal e lançá -la e inserir no fluxo lá dentro.
ostream &operator <<(std::ostream &stream, const Literal &rhs)
{
stream << (string) rhs;
return stream;
}
Outras dicas
Resposta curta: continue usando um elenco ou toStr()
, ou escreva o seu próprio operator<<
função. (Eu preferiria l1.toStr()
para (string)l1
.)
Resposta longa: isso pode funcionar se a biblioteca padrão tivesse uma função
std::ostream& operator<<( std::ostream&, std::string const& );
O que quase faz, mas não tecnicamente. Ambos ostream
e string
são realmente digitados de instanciações de modelos. E há uma função de modelo para inserir uma na outra.
// This is somewhat simplified. For the real definitions, see the Standard
// and/or your complying implementation's headers.
namespace std {
typedef basic_string<char> string;
typedef basic_ostream<char> ostream;
template <typename CharT>
basic_ostream<CharT>& operator<<(
basic_ostream<CharT>&,
basic_string<CharT> const&);
}
Então, quando você usa cout << str
onde o tipo de str
é std::string
, pode descobrir usar essa função de modelo, com CharT = char
.
Mas o C ++ não permite que você faça com que o compilador descubra uma conversão de tipo implícito (Literal
para string
) e Deduce Model Function Model Parameters (CharT = char
) na mesma chamada.