Я хотел бы знать, почему следующие operator<<
перегрузок существуют для basic_ostream
«s char
частичных-специализаций:Почему существуют перегрузки 'operator <<' для частичной специализации 'char' для std :: basic_ostream?
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
, чтобы избежать этих нежелательных функциональных перегрузок.- , что, вероятно, снижает эффективность кода пользователя.
В обоих случаях код пользователя выглядит уродливее, чем должно быть.
- явно приводится к
@LokiAstari Он имеет то же представление, что и один из них, но это особый тип. –
Просто * что * об IOStreams is * not * громоздко? –
Я думаю, что ваша реальная проблема заключается не в том, что существуют перегрузки, а в том, что они ведут себя так, как будто вы передаете символьные данные, а не целые числа. Разве это не проблема? –