の部分的な特殊化に対して次のオーバーロードが存在する理由を知りたいです。operator<<
basic_ostream
char
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 );
私が知りたい理由:
オーバーロードはせいぜい冗長であり、一般的に扱いにくいと思います。
特殊化されていないテンプレート型の次のオーバーロードは既に存在し、機能を提供し
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 );
signed char
とunsigned char
は文字型ではなく ( にはありませんchar_traits
)、整数値として使用できる必要があります (特に 、 などのコンテキストstdint.h
では)。次のような煩わしさを回避するには、ゲームをプレイする必要があります。int8_t
uint8_t
- ユースケースごと
に、、 、またはに明示的にキャスト
signed char
します。signed short
unsigned char
unsigned short
signed char*
unsigned char*
void*
- これには、回避策として関数のオーバーロードまたはユーザー コードでのテンプレートの部分的な特殊化が必要です。
wchar_t
同等のものを使用して、basic_ostream
これらの望ましくない関数のオーバーロードを回避します。- これにより、ユーザー コードのパフォーマンスが低下する可能性があります。
どちらの場合も、ユーザー コードは必要以上に醜く見えます。
- ユースケースごと
に、、 、またはに明示的にキャスト