【问题标题】:Xcode 4.5.2 libc++ std::bad_cast when implementing custom (string)stream实现自定义(字符串)流时的 Xcode 4.5.2 libc++ std::bad_cast
【发布时间】:2012-11-23 19:10:01
【问题描述】:

我在使用 char16_t 作为 char 类型来实现我自己的自定义 stringbuf 和 stringstream 时遇到问题。作为测试,我使用了在旧的、可能已经过时的 C++ 手册中找到的 nullstringbuf 和 nullstringstream。这个 nullstringstream 充当“/dev/null”并且是一个简单的实现。
这个简单的 nullstream 在我使用 <char> 时有效,但在我使用 <char16_t> 时因 std::bad_cast 异常而失败。我知道必须有一个 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!
     };

为了编译它,我还需要专门化 std::ctype&lt;char16_t&gt;

我的问题?

  • 除此之外,我是否需要实施或专门化 std::ctype/std::basic_stringbuf/std::basic_stringstream 等等 类或模板?
  • 有其他人在使用时遇到同样的问题吗 libc++、char16_t 和 iostreams?

感谢您的帮助。

【问题讨论】:

    标签: c++ iostream


    【解决方案1】:

    使用不易支持的流类型实例化 IOStream 需要的不仅仅是实例化它并提供std::char_traits&lt;cT&gt;。至少你还需要实例化一些方面:

    • std::ctype&lt;cT&gt; 被访问,尽管在许多情况下不一定使用。
    • std::numpunct&lt;cT&gt; 在格式化或解析任何数字类型时使用。
    • 解析sny数值类型时需要std::num_get&lt;cT&gt;
    • 格式化任何数字类型时,std::num_put&lt;cT&gt; 会被添加。
    • 如果您要使用文件流,您还需要提供std::codecvt&lt;cT, char&gt;

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

    【讨论】:

      猜你喜欢
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多