2012-11-23 8 views
5

मुझे चार प्रकार के रूप में char16_t का उपयोग करके अपने स्वयं के कस्टम स्ट्रिंगबफ और स्ट्रिंगस्ट्रीम को लागू करने में समस्याएं आ रही हैं। परीक्षण के रूप में मैंने एक nullstringbuf और nullstringstream का उपयोग किया जो मैंने पुराने में पाया, और शायद दिनांकित C++ मैन्युअल। यह nullstringstream "/ dev/null" के रूप में कार्य करता है और यह एक सरल कार्यान्वयन है।
यह सरल नलस्ट्रीम काम कर रहा है जब मैं <char> का उपयोग करता हूं लेकिन <char16_t> का उपयोग करते समय std :: bad_cast अपवाद के साथ विफल रहता है। मुझे पता है कि char_traits<char16_t> उपलब्ध होना चाहिए लेकिन libC++ ऐसा प्रतीत होता है।एक्सकोड 4.5.2 libC++ std :: bad_cast कस्टम (स्ट्रिंग) स्ट्रीम को लागू करते समय

 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! 
    }; 

यह संकलित करने के लिए मैं भी std::ctype<char16_t> विशेषज्ञ की जरूरत है।

मेरे सवालों का ?:

  • मैं लागू करने या विशेषज्ञ, अलावा करने की आवश्यकता है std :: CTYPE/std :: basic_stringbuf/std :: basic_stringstream, किसी भी अधिक वर्ग या टेम्पलेट्स?
  • क्या कोई और libC++, char16_t और iostreams का उपयोग कर एक ही समस्या है?

किसी भी मदद के लिए धन्यवाद।

उत्तर

3

आईओएसट्रीम को तत्काल समर्थित स्ट्रीम प्रकार के साथ इंस्टेंट करने के लिए केवल इसे तुरंत चालू करने और std::char_traits<cT> प्रदान करने की आवश्यकता होती है। कम से कम इतना तो आप भी पहलुओं के एक नंबर का दृष्टांत की जरूरत है:

  • std::ctype<cT> पहुँचा हो जाता है, हालांकि जरूरी कई संदर्भों में नहीं हुआ करता था।
  • std::numpunct<cT> किसी भी संख्यात्मक प्रकार को स्वरूपित या पार्स करते समय उपयोग किया जाता है।
  • std::num_get<cT> की आवश्यकता होती है जब सनी संख्यात्मक प्रकार का विश्लेषण किया जाता है।
  • std::num_put<cT> किसी भी संख्यात्मक प्रकार को स्वरूपित करते समय बीड किया जाता है।
  • यदि आप फ़ाइल स्ट्रीम का उपयोग करना चाहते हैं तो आपको std::codecvt<cT, char> प्रदान करने की भी आवश्यकता होगी।

ऑफ-हाथ मुझे लगता है कि ये आपको आवश्यक पहलू हैं। हालांकि, मुझे याद है कि मेरी धाराओं को स्थापित करने के लिए मुझे और अधिक चीज की आवश्यकता थी, जैसा कि मैंने सोचा था।

संबंधित मुद्दे