【发布时间】:2013-02-04 09:25:50
【问题描述】:
我想知道为什么basic_ostream 的char 部分专业化存在以下operator<< 重载:
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),它们应该可以用作整数值,(尤其是在int8_t的stdint.h上下文中,uint8_t等)然而这些重载与这两点形成对比;人们必须玩游戏来解决这些烦恼,例如:- 针对每个用例将
signed char显式转换为signed short、unsigned char转换为unsigned short和signed char*或unsigned char*转换为void*。- 这需要在用户代码中解决函数重载或模板部分特化。
- 使用
wchar_t等效的basic_ostream来避免这些不需要的函数重载。- 这可能会降低用户代码的性能。
在这两种情况下,用户代码看起来都比实际需要的更丑。
- 针对每个用例将
【问题讨论】:
-
@LokiAstari 它与其中一个具有相同的表示,但它是一种不同的类型。
-
关于 IOStreams 什么不很麻烦?
-
我认为您真正的问题不是存在重载,而是它们的行为就像您传递字符数据而不是整数一样。不是这个问题吗?
-
@BenjaminLindley,是的,这就是行为问题。 :-) 如果这些特定的重载不存在,我相信
basic_ostream的行为会更接近我的预期,并将signed char和unsigned char视为整数类型。但在创建库时一定有一些原因要添加特定的重载函数。
标签: c++ integer char operator-overloading ostream