实现自定义(字符串)流时,Xcode 4.5.2 libc ++ std :: bad_cast

Hen*_*and 5 c++ iostream

我在使用char16_t作为char类型实现我自己的自定义stringbuf和stringstream时遇到问题.作为测试,我使用了nullstringbuf和nullstringstream,我在旧的,可能是过时的C++手册中找到了.此nullstringstream充当"/ dev/null"并且是一个简单的实现.
这个简单的nullstream在我使用时工作<char>但在我使用时失败并带有std :: bad_cast异常<char16_t>.我知道必须有一个char_traits<char16_t>可用但libc ++似乎有它存在.

     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!
     };
Run Code Online (Sandbox Code Playgroud)

要编译它我还需要专门化std::ctype<char16_t>.

我的问题?:

  • 除了std :: ctype/std :: basic_stringbuf/std :: basic_stringstream之外,我还需要实现或专门化更多的类或模板吗?
  • 有没有其他人使用libc ++,char16_t和iostreams同样的问题?

谢谢你的帮助.

Die*_*ühl 3

使用不易支持的流类型实例化 IOStreams 需要的不仅仅是实例化它并提供std::char_traits<cT>. 至少您还需要实例化多个方面:

  • std::ctype<cT>尽管在许多情况下不一定使用,但仍会被访问。
  • std::numpunct<cT>在格式化或解析任何数字类型时使用。
  • std::num_get<cT>解析 sny 数字类型时需要。
  • std::num_put<cT>格式化任何数字类型时都会被插入。
  • 如果您要使用文件流,您还需要提供std::codecvt<cT, char>.

我认为这些是你需要的方面。然而,我记得我需要做的事情比我想象的要多。