我想知道为什么' 的部分专业化存在以下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
andchar*
功能: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
tounsigned short
和signed char*
orunsigned char*
to 。void*
- 这需要用户代码中的解决方法功能重载或模板部分专业化。
- 使用
wchar_t
等价物basic_ostream
来避免这些不希望的函数重载。- 这可能会降低用户代码的性能。
在这两种情况下,用户代码看起来都比实际需要的更难看。
- 为每个用例
显式