- 论坛徽章:
- 0
|
回复 18# AD8018
嘛……实现上会有些问题,不过涉及core language features了。
比如trim的默认参数,考虑string就很好写,但光是考虑basic_string的其它实例就麻烦了(懒得特化党在此)……
一个罗嗦的解决方案:逐个元素弄成std::array,然后祈祷编译器会尽量优化掉……
- template<typename _type, size_t _vN, typename _tSrc>
- constexpr std::array<_type, _vN>
- make_array(const _tSrc& src)
- {
- return std::array<_type, _vN>(src);
- }
- template<typename _type, size_t _vN>
- constexpr std::array<_type, _vN>
- make_array(const std::array<_type, _vN>& src)
- {
- return src;
- }
- template<typename _type, size_t _vN, typename _tSrcElement>
- inline std::array<_type, _vN>
- make_array(const _tSrcElement(&src)[_vN])
- {
- using namespace std;
- array<_type, _vN> arr;
- copy_n(addressof(src[0]), _vN, addressof(arr[0]));
- return std::move(arr);
- }
- template<typename _type, size_t _vN, typename _tSrcElement>
- inline std::array<_type, _vN>
- make_array(_tSrcElement(&&src)[_vN])
- {
- using namespace std;
- array<_type, _vN> arr;
- copy_n(make_move_iterator(addressof(src[0])), _vN, addressof(arr[0]));
- return std::move(arr);
- }
- template<typename _tString>
- struct string_traits
- {
- typedef typename std::remove_reference<_tString>::type string_type;
- typedef typename string_type::value_type value_type;
- typedef typename std::char_traits<value_type> traits_type;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
- typedef std::initializer_list<value_type> initializer;
- };
- template<class _tString>
- inline _tString&
- ltrim(_tString&& str, typename string_traits<_tString>::const_pointer t
- = &make_array<typename string_traits<_tString>::value_type>("\n\r\t\v ")[0])
- {
- return str.erase(0, str.find_first_not_of(t));
- }
- template<class _tString>
- inline _tString&
- rtrim(_tString&& str, typename string_traits<_tString>::const_pointer t
- = &make_array<typename string_traits<_tString>::value_type>("\n\r\t\v ")[0])
- {
- return str.erase(str.find_last_not_of(t) + 1);
- }
- template<class _tString>
- inline _tString&
- trim(_tString&& str, typename string_traits<_tString>::const_pointer t
- = &make_array<typename string_traits<_tString>::value_type>("\n\r\t\v ")[0])
- {
- return ltrim(rtrim(str, t));
- }
复制代码 |
|