src\rttr\string_view.h
对github项目rttr(C++反射库)解析,链接:https://github.com/rttrorg/rttr
template<typename CharT, typename Traits = std::char_traits > class basic_string_view
私有成员变量
- const value_type* m_data (value_type = CharT)
- size_type m_size (size_type = std::size_t)
实现文件:rttr/detail/impl/string_view_impl.h
typename Traits = std::char_traits 主要是对CharT类型进行获取并有相关一系列函数对获取的类型做相关处理操作。比如:
template<typename CharT, typename Traits>
RTTR_CXX14_CONSTEXPR int basic_string_view<CharT, Traits>::compare(basic_string_view v) const RTTR_NOEXCEPT
{const int cmp = traits_type::compare(m_data, v.m_data, (std::min)(m_size, v.m_size));return (cmp != 0 ? cmp : (m_size == v.m_size ? 0 : m_size < v.m_size ? -1 : 1));
}
traits_type::compare()函数就是对CharT类型数据做比较,std::char_traits就是获取CharT类型,让类中的相关函数都能获取CharT类型。这里相关STL源码后续对其进行分析解释,这里先描述一下作用。
成员函数解释:
- template explicit operator std::basic_string<CharT, Traits, Allocator>() const
operator className() :basic_string_view类的转换函数,可通过强制类型转换将basic_string_view类型转换成为std::basic_string类型。
- const_reverse_iterator rbegin() const RTTR_NOEXCEPT
template<typename CharT, typename Traits>
typename basic_string_view<CharT, Traits>::const_reverse_iterator
basic_string_view<CharT, Traits>::rbegin() const RTTR_NOEXCEPT
{return const_reverse_iterator(end());
}
template<typename CharT, typename Traits>
RTTR_CONSTEXPR typename basic_string_view<CharT, Traits>::const_iterator
basic_string_view<CharT, Traits>::end() const RTTR_NOEXCEPT
{return (m_data + m_size);
}
end()函数返回的是const CharT*类型,const_reverse_iterator = std::reverse_iterator<const_iterator>,使用的是std::reverse_iterator,其中std::reverse_iterator主要作用就是对const CharT *类型的数据进行相关的像指针一样的操作对数据进行“逆序遍历”。
- RTTR_CONSTEXPR const_reference operator[](size_type pos) const RTTR_NOEXCEPT
template<typename CharT, typename Traits>
RTTR_CONSTEXPR typename basic_string_view<CharT, Traits>::const_reference
basic_string_view<CharT, Traits>::operator[](size_type pos) const RTTR_NOEXCEPT
{return m_data[pos];
}
直接通过下标方式进行访问当前pos位置的单字符
- RTTR_CXX14_CONSTEXPR int compare(basic_string_view v) const RTTR_NOEXCEPT
template<typename CharT, typename Traits>
RTTR_CXX14_CONSTEXPR int basic_string_view<CharT, Traits>::compare(basic_string_view v) const RTTR_NOEXCEPT
{const int cmp = traits_type::compare(m_data, v.m_data, (std::min)(m_size, v.m_size));return (cmp != 0 ? cmp : (m_size == v.m_size ? 0 : m_size < v.m_size ? -1 : 1));
}
this->m_data和v.m_data在std::min(this->m_size, v.m_size)长度中比较字符ASCII值的大小
- RTTR_INLINE RTTR_CXX14_CONSTEXPR bool operator==(basic_string_view<CharT, Traits> lhs, basic_string_view<CharT, Traits> rhs) RTTR_NOEXCEPT
RTTR_INLINE RTTR_CXX14_CONSTEXPR bool operator==(basic_string_view<CharT, Traits> lhs,basic_string_view<CharT, Traits> rhs) RTTR_NOEXCEPT
{if (lhs.size () == rhs.size ())return (lhs.compare(rhs) == 0);elsereturn false;
}
根据ASCII码值判断是否相等并且必须是一样的长度
-
template<typename CharT, typename Traits>
RTTR_INLINE std::basic_string<CharT, Traits> operator+(basic_string_view<CharT, Traits> lhs,const std::basic_string<CharT, Traits>& rhs)
template<typename CharT, typename Traits>
RTTR_INLINE std::basic_string<CharT, Traits> operator+(basic_string_view<CharT, Traits> lhs,const std::basic_string<CharT, Traits>& rhs)
{return (lhs.to_string() + rhs);
}
lhs和rhs字符串相连
类中支持什么?
支持构造、拷贝构造、赋值、交换、迭代器、反向迭代器、获取长度/大小、下标访问、std::basic_string<CharT, Traits, Allocator>类型转换、比较判断、operator+、operator<<
疑问:上述中std::string和basic_string_view有什么区别?
细心发现std::string中有扩容函数,但是这里没有扩容,只是对数据进行了一个浅拷贝(指针赋值),所以basic_string_view使用的初衷应该就是像类名一样只是对字符串做个查看等操作并没有对字符串修改的能力。