É possível obter o lançamento automático do tipo definido pelo usuário para STD :: String usando o cout?

StackOverflow https://stackoverflow.com/questions/4000358

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).

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top