我在使用 char16_t 作为 char 类型来实现我自己的自定义 stringbuf 和 stringstream 时遇到问题。作为测试,我使用了在旧的、可能已经过时的 C++ 手册中找到的 nullstringbuf 和 nullstringstream。这个 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!
};
为了编译它,我还需要专门化std::ctype<char16_t>
.
我的问题?:
- 除了 std::ctype/std::basic_stringbuf/std::basic_stringstream 之外,我还需要实现或专门化任何类或模板吗?
- 其他人使用 libc++、char16_t 和 iostreams 有同样的问题吗?
谢谢你的帮助。