为什么重载'operator<<'是否存在std :: basic_ostream的'char'部分特化?

时间:2013-02-19 16:03:20

标签: c++ integer char operator-overloading ostream

我想知道为什么 operator<<的{​​{1}}部分专业化存在以下basic_ostream重载:

char

为什么我要知道

我发现过载最多是多余的,而且通常很麻烦:

  1. 已存在以下非专业模板类型的重载,并提供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*
  2. 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_traitsstdint.h等的int8_t背景。然而,这些重叠与这两点形成鲜明对比;一个人必须玩游戏来解决这些烦恼,例如:

    • 为每次使用明确地将uint8_t投放到signed charsigned short投放到unsigned charunsigned shortsigned char*投放到unsigned char* -案件。
      • 需要在用户代码中使用解决方法函数重载或模板部分特化。
    • 使用void*等效wchar_t来避免这些不需要的函数重载。
      • 可能会降低用户代码的性能。

    在这两种情况下,用户代码看起来都比它需要的更加粗糙。

2 个答案:

答案 0 :(得分:1)

必须使用重载才能在不指定所有模板类型的情况下使用运算符。如果类型匹配,编译器只使用正确的重载。如果它们不匹配,则要么必须进行隐式转换(不合需要),要么必须明确指定所有模板类型,我甚至不确定是否存在允许您这样做的语法。

答案 1 :(得分:1)

char特征和各种char重载无关。

char特征是关于char类型和输出流的处理,而char重载与char类型插入有关。例如,可以考虑basic_ostream<wchar_t>operator<<(basic_ostream, char)

您还必须考虑它是实现定义的,普通字符是signed还是unsigned。还

  

3.9.1基本类型[basic.fundamental]
  1 ... Plain char,signed char和unsigned char是三种不同的类型。

因此,仅charconst char*的重载并未涵盖所有可能性。我想,定义这些重载只是为了完成并覆盖所有基本类型。