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を使用して同じ問題を抱えている人は他にいますか?
助けてくれてありがとう。