5

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を使用して同じ問題を抱えている人は他にいますか?

助けてくれてありがとう。

4

1 に答える 1

3

容易にサポートされないストリームタイプでIOStreamをインスタンス化するには、単にインスタンス化してを提供するだけでは不十分std::char_traits<cT>です。少なくとも、いくつかのファセットをインスタンス化する必要もあります。

  • std::ctype<cT>多くのコンテキストで必ずしも使用されるわけではありませんが、アクセスされます。
  • std::numpunct<cT>数値タイプをフォーマットまたは解析するときに使用されます。
  • std::num_get<cT>sny数値型を解析するときに必要です。
  • std::num_put<cT>数値タイプをフォーマットするときにビードされます。
  • ファイルストリームを使用する場合は、も提供する必要がありますstd::codecvt<cT, char>

オフハンド私はこれらがあなたが必要とするファセットだと思います。ただし、ストリームを設定するために必要と思われるよりも多くのことを行う必要があったことを覚えています。

于 2012-11-23T20:08:40.350 に答える