class array_range
对github项目rttr(C++反射库)解析,链接:https://github.com/rttrorg/rttr
template<typename T, typename Predicate = detail::default_predicate<T>>
class array_range
{
...
private:
const T* const m_begin;
const T* const m_end;
const Predicate m_pred;
};
- detail::default_predicate
template<typename T>
struct default_predicate
{
RTTR_FORCE_INLINE default_predicate() {}
RTTR_FORCE_INLINE default_predicate(std::function<bool(const T&)> func) : m_func(std::move(func)) {}
RTTR_FORCE_INLINE bool operator()(const T& obj) const { return (m_func ? m_func(obj) : true); }
std::function<bool(const T&)> m_func;
};
成员变量是m_func函数包装器,返回值类型是bool,参数类型是const T&;可通过()访问,有函数operator()()
- array_range()
template<typename T, typename Predicate>
RTTR_INLINE array_range<T, Predicate>::array_range()
: m_begin(nullptr),
m_end(nullptr)
{
}
- array_range(const T* begin, size_type size, const Predicate& pred = Predicate())
template<typename T, typename Predicate>
RTTR_INLINE array_range<T, Predicate>::array_range(const T* begin, size_type size, const Predicate& pred)
: m_begin(begin),
m_end(begin + size),
m_pred(pred)
{
}
此函数告知array_range只是存储了起始位置和结束位置。
- class array_iterator_base
template<typename DataType>
class array_iterator_base
{
public:
using self_type = array_iterator_base<DataType>;
using value_type = DataType;
using reference = DataType&;
using pointer = DataType*;
using iterator_category = std::forward_iterator_tag;
using difference_type = std::ptrdiff_t;
bool operator==(const self_type& rhs) const;
bool operator!=(const self_type& rhs) const;
array_iterator_base& operator=(const self_type& other);
protected:
friend class array_range<T, Predicate>;
array_iterator_base();
array_iterator_base(pointer ptr, const array_range<T, Predicate>* const range);
pointer m_ptr;
const array_range<T, Predicate>* m_range;
};
class array_iterator_base是class array_range的内部类,自带模板template, 并没有使用到class array_range的template<typename T, typename Predicate = detail::default_predicate>中的T模板参数
template<typename DataType>
class array_iterator : public array_iterator_base<DataType>
using iterator = array_iterator<T>;
最终array_iterator模板本质还是使用的class array_range的模板参数T
template<typename T, typename Predicate>
template<typename DataType>
RTTR_INLINE
array_range<T, Predicate>::array_iterator_base<DataType>::array_iterator_base(typename array_iterator_base<DataType>::pointer ptr,const array_range<T, Predicate>* const range)
: m_ptr(ptr),
m_range(range)
{
}
m_range的作用是什么呢?
template<typename T, typename Predicate>
template<typename DataType>
RTTR_INLINE typename array_range<T, Predicate>::template array_iterator<DataType>::self_type&
array_range<T, Predicate>::array_iterator<DataType>::operator++()
{
this->m_range->next(*this);
return *this;
}
template<typename T, typename Predicate>
template<typename DataType>
RTTR_INLINE void array_range<T, Predicate>::next(array_iterator<DataType>& itr) const
{
++itr.m_ptr;
while(itr.m_ptr != m_end && !m_pred(*itr.m_ptr))
{
++itr.m_ptr;
}
}
m_range相当于当前this.
总结:class array_range中只有两个数据成员变量:m_begin和m_end,支持普通迭代器和反向迭代器,仅仅只是支持访问当前数据和operator++()并没有operator–(),这个设计后面进行解析,单独看class array_range类无法知道这个设计是为什么。使用到m_begin和m_end来记录外部数组的起始和结束位置,具体作用也只是对数组做个视图,并没有修改数据的能力,仅仅只有访问的能力。