2012-11-23 8 views
5

Ho problemi nell'implementare il mio stringbuf personalizzato e stringstream utilizzando char16_t come tipo di carattere. Come test ho usato un nullstringbuf e un nullstringstream che ho trovato in un vecchio, e forse obsoleto manuale C++. Questo nullstringstream agisce come "/ dev/null" ed è una semplice implementazione.
Questo semplice nullstream funziona quando utilizzo <char> ma non riesce con un'eccezione std :: bad_cast quando utilizzo <char16_t>. So che ci deve essere un char_traits<char16_t> disponibile ma libC++ sembra averlo presente.Xcode 4.5.2 libC++ std :: bad_cast durante l'implementazione del flusso personalizzato (stringa)

 class nullstringbuf : public std::basic_stringbuf<char16_t> 
    { 
    public: 
     nullstringbuf() 
     { 
      setp(0,0); 
      setg(0,0,0); 
     } 


     virtual ~nullstringbuf() 
     { 

     } 

     virtual int_type underflow() 
     { 
      setg(0,0,0); 
      return traits_type::eof(); 
     } 


     virtual int overflow(int c) 
     { 
      setp(0,0); 
      if (c==traits_type::eof()) 
       return 0; 

      return c; 
     } 


    }; 



    class nullstringstream : virtual public std::basic_stringstream<char16_t> 
    { 
    public: 
     // Constructor(s) 
     nullstringstream(std::ios_base::openmode om = std::ios_base::out | std::ios_base::in) 
     : std::basic_stringstream<char16_t>(om) 
     { 
      init(&m_StreamBuf); 
     } 

     nullstringstream(base::xstring const& val, std::ios_base::openmode om = std::ios_base::out | std::ios_base::in) 
     : std::basic_stringstream<char16_t>(val, om) 
     { 
      init(&m_StreamBuf); 
     } 

     // Destructor 
     virtual ~nullstringstream() 
     { 

     } 


     nullstringbuf* rdbuf() 
     { 
      return &m_StreamBuf; 
     } 

     std::basic_string<char16_t> str() const 
     { 
      return m_StreamBuf.str(); 
     } 

    private: 
     nullstringbuf   m_StreamBuf; 

     nullstringstream(nullstringstream const &); // do NOT implement! 
     nullstringstream& operator=(nullstringstream const &); // do NOT implement! 
    }; 

per farlo compilato Ho anche bisogno di specializzarsi std::ctype<char16_t>.

Le mie domande ?:

  • Ho bisogno di implementare o specializzarsi, oltre std :: ctype/std :: basic_stringbuf/std :: basic_stringstream, non più di classi o modelli?
  • Qualcun altro ha gli stessi problemi utilizzando libC++, char16_t e iostreams?

Grazie per qualsiasi aiuto.

risposta

3

L'istanziazione di IOStreams con un tipo di flusso non supportato non richiede solo un'istanza e fornisce std::char_traits<cT>. Per lo meno è inoltre necessario creare un'istanza di un numero di sfaccettature:

  • std::ctype<cT> ottiene accedere anche se non necessariamente utilizzato in molti contesti.
  • std::numpunct<cT> viene utilizzato durante la formattazione o l'analisi di qualsiasi tipo numerico.
  • std::num_get<cT> è necessario quando si analizza un tipo numerico.
  • std::num_put<cT> viene generato durante la formattazione di qualsiasi tipo numerico.
  • Se si desidera utilizzare flussi di file, è necessario fornire anche std::codecvt<cT, char>.

Fuori mano Penso che queste siano le sfaccettature che ti servono. Tuttavia, ricordo che c'erano più cose che dovevo fare per impostare i miei flussi di quanto pensassi sarebbe stato necessario.

Problemi correlati