我想知道为什么' 的部分专业化存在以下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 );
为什么我想知道:
我发现重载充其量是多余的,而且通常很麻烦:
以下非专用模板类型的重载已经存在,并提供了
charandchar*功能: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_tuint8_t- 为每个用例
显式
signed char转换为signed short、unsigned chartounsigned short和signed char*orunsigned char*to 。void*- 这需要用户代码中的解决方法功能重载或模板部分专业化。
- 使用
wchar_t等价物basic_ostream来避免这些不希望的函数重载。- 这可能会降低用户代码的性能。
在这两种情况下,用户代码看起来都比实际需要的更难看。
- 为每个用例
显式