12.2.2 字符特性
对于多种字符集,多种表述方式给string和I/O的处理到来了多样性。字符串string和类stream可以根据内部型别完成对象的初始化。内部型别的接口不能够改变,需要引进一个独立的类别,即特性类别(Trait Class)。“如何处理和表述相关的各个刻面”的相关细节被统统放入该类别中,这是特性类别的概念表述。string和stream classes都将traits class作为template参数;此参数默认为char_traits,并以string或stream获取模板的参数作为参数。
字符特性(Character Traits)的型别为char_traits< >。该型别在<string>中定义,以字符型别为参数:
特性类定义了字符型别的所有基本特性,并以静态组件的形式定义出类strings和类stream中不可或缺的相关操作。
字符串和字符序列的处理函数,其存在价值完全是为了效率优化,其实完全可以运用“只处理单个字符”的函数实例出来。例如,copy()可运用assign()实例出来,而在处理字符串时,copy()可能会采用更有效率的实例化技术。
注意
函数中使用的计数是确切的计数值,不是最大计数值,即所用序列的终止字符将被忽略。
最后一组函数专门对end-of-file字符进行特殊处理。该字符通过人工字符扩充字符集,用以指示某种特殊的处理。对某些表述而言,字符型别不足以容纳该特殊字符,因为EOF字符必须使用字符集中一般字符之外的值。C语言为此建立了一种转换模式:令字符函数返回一个int,而不是一个char。该技巧被C++语言继承并发扬。字符特性型别定义了char_type型别用于代表所有字符型别,定义了int_type用以代表“所有字符,外加EOF”的型别。函数to_char_type()、to_int_type()、not_eof()、eq_int_type()定义了相应的转换和比较操作。对于某些特殊字符,char_type和int_type可能是相同的。char_type中并非所有数值都必须拿来表示字符,因此一定会有多余的值拿来代表EOF。
pos_type和off_type用于定义文件位置和偏移距离。类模板char_trait的成员见表12-1。
表12-1 字符特性类char_trait
C++标准程序将char_traits< >型别针对char和wchar_t进行了特化设计:
针对char而设计的特化版本,通常在实作过程中会运用定义于<cstring>或<string.h>内的C全局函数。