我在使用char16_t作为char类型实现我自己的自定义stringbuf和stringstream时遇到问题.作为测试我使用了nullstringbuf和nullstringstream,我在一个旧的,可能是过时的C手册中找到了.此nullstringstream充当“/ dev / null”并且是一个简单的实现.
当我使用< char>时,这个简单的零流正在工作但是当我使用< char16_t>时失败并出现std :: bad_cast异常.我知道必须有一个char_traits< char16_t>可用,但libc似乎有它.
当我使用< 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); } virtual ~nullstringbuf() { } virtual int_type underflow() { setg(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?
谢谢你的帮助.
解决方法
使用不容易支持的流类型实例化IOStream需要的不仅仅是实例化它并提供std :: char_traits< cT>.至少你还需要实例化一些方面:
> std :: ctype< cT>虽然不一定在许多情况下使用,但仍可访问.
> std :: numpunct< cT>在格式化或解析任何数字类型时使用.
> std :: num_get< cT>解析sny数字类型时需要.
> std :: num_put< cT>格式化任何数字类型时都会被删除.
>如果您要使用文件流,您还需要提供std :: codecvt< cT,char>.
副手我认为这些是你需要的方面.但是,我记得我需要做的事情比我认为必要的更多.