std::string 的定义:
using string = basic_string<char, char_traits<char>, allocator<char>>;
每次看到都觉得不明所以:第一个char还能理解,第二个char_traits是什么?
其实源码之下,了无秘密。
打开char_traits的定义,发现它就是一个都是操作字符串static函数的结构体
它有一个char的特化版本:
template<> struct char_traits<char>
{ // properties of a string or stream char element
typedef char _Elem;
typedef _Elem char_type;
typedef int int_type;
typedef streampos pos_type;
typedef streamoff off_type;
typedef _Mbstatet state_type;
static int __CLRCALL_OR_CDECL compare(const _Elem *_First1, const _Elem *_First2,
size_t _Count)
{ // compare [_First1, _First1 + _Count) with [_First2, ...)
return (_Count == 0 ? 0
: _CSTD memcmp(_First1, _First2, _Count));
}
static size_t __CLRCALL_OR_CDECL length(const _Elem *_First)
{ // find length of null-terminated string
return (*_First == 0 ? 0
: _CSTD strlen(_First));
}
static _Elem *__CLRCALL_OR_CDECL copy(_Elem *_First1, const _Elem *_First2,
size_t _Count)
{ // copy [_First2, _First2 + _Count) to [_First1, ...)
return (_Count == 0 ? _First1
: (_Elem *)_CSTD memcpy(_First1, _First2, _Count));
}
。。。
};
在basic_string的函数里就有用到:
template<class _Elem,
class _Traits,
class _Alloc>
class basic_string
: public _String_alloc<_String_base_types<_Elem, _Alloc> >
{ // null-terminated transparent array of elements
//...
_Myt& append(const _Elem *_Ptr)
{ // append [_Ptr, <null>)
_DEBUG_POINTER(_Ptr);
return (append(_Ptr, _Traits::length(_Ptr)));
}
//...
};
这里的_Traits就是char_traits
但是,明明是函数的集合,叫它XXX_traits,是不是有点让人迷惑,就因为它有一堆typedef?
typedef char _Elem;
typedef _Elem char_type;
typedef int int_type;
typedef streampos pos_type;
typedef streamoff off_type;
typedef _Mbstatet state_type;