basic_string的各个模板参数,尤其是char_traits到底是什么

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值