2

の部分的な特殊化に対して次のオーバーロードが存在する理由を知りたいです。operator<<basic_ostreamchar

template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
                                        char ch );
template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
                                        signed char ch );
template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
                                        unsigned char ch );
template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,  
                                        const char* s );
template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
                                        const signed char* s );
template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,traits>& os,
                                        const unsigned char* s );

私が知りたい理由

オーバーロードはせいぜい冗長であり、一般的に扱いにくいと思います。

  1. 特殊化されていないテンプレート型の次のオーバーロードは既に存在し、機能を提供しcharますchar*

    template< class CharT, class Traits>
    basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
                                             CharT ch );
    template< class CharT, class Traits>
    basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
                                             char ch );
    template< class CharT, class Traits >
    basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
                                             const CharT* s );
    template< class CharT, class Traits >
    basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
                                             const char* s );
    
  2. signed charunsigned charは文字型ではなく ( にはありませんchar_traits)、整数値として使用できる必要があります (特に 、 などのコンテキストstdint.hでは)。次のような煩わしさを回避するには、ゲームをプレイする必要があります。int8_tuint8_t

    • ユースケースごと に、、 、またはに明示的にキャストsigned charします。signed shortunsigned charunsigned shortsigned char*unsigned char*void*
      • これには、回避策として関数のオーバーロードまたはユーザー コードでのテンプレートの部分的な特殊化が必要です。
    • wchar_t同等のものを使用して、basic_ostreamこれらの望ましくない関数のオーバーロードを回避します。
      • これにより、ユーザー コードのパフォーマンスが低下する可能性があります。

    どちらの場合も、ユーザー コードは必要以上に醜く見えます。

4

2 に答える 2

1

char 特性とさまざまな char オーバーロードは関連していません。

char 特性は char 型と出力ストリームの処理に関するものですが、char オーバーロードは挿入されるchar 型と関係があります。たとえばbasic_ostream<wchar_t>対を考えてみてください。operator<<(basic_ostream, char)

signedプレーン char が であるかであるかに関係なく、実装定義であることも考慮する必要がありますunsigned。また

3.9.1 基本型 [basic.fundamental]
1 ... プレーン char、signed char、および unsigned char は、3 つの異なる型です。

そのため、 just charorのオーバーロードは、const char*すべての可能性をカバーしていません。これらのオーバーロードを定義することは、完全であり、すべての基本的な型をカバーするためだと思います。

于 2013-02-19T16:23:05.627 に答える
1

オーバーロードは、すべてのテンプレート タイプを指定せずに演算子を使用できるようにするために必要です。型が一致する場合、コンパイラは適切なオーバーロードを使用します。それらが一致しない場合は、暗黙的な変換を行う必要がある (望ましくない) か、すべてのテンプレート タイプを明示的に指定する必要があります。それを可能にする構文があるかどうかさえわかりません。

于 2013-02-19T16:15:33.660 に答える