我在使用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>
.
我的问题?:
谢谢你的帮助.
使用不易支持的流类型实例化 IOStreams 需要的不仅仅是实例化它并提供std::char_traits<cT>
. 至少您还需要实例化多个方面:
std::ctype<cT>
尽管在许多情况下不一定使用,但仍会被访问。std::numpunct<cT>
在格式化或解析任何数字类型时使用。std::num_get<cT>
解析 sny 数字类型时需要。std::num_put<cT>
格式化任何数字类型时都会被插入。std::codecvt<cT, char>
.我认为这些是你需要的方面。然而,我记得我需要做的事情比我想象的要多。
归档时间: |
|
查看次数: |
398 次 |
最近记录: |