使用 boost::any_range
时,指定不应修改底层容器(如果有(的正确方法是什么?
例如,使用别名
template<typename T>
using Range = boost::any_range<T, boost::forward_traversal_tag>;
声明无法修改基础容器或"数据源"内容的区域,是否应将其声明为
const Range<T> myRange;
或作为
Range<const T> myRange;
?
我怀疑第一个版本是正确的。但是,如果我应用任何boost::adaptors
,是否可以保证保持容器的const
性?
编辑
从文档中可以看出,显然range_iterator
元函数通过使用const T
而不是T
声明范围来"推断"底层容器的const
性。也就是说,range_iterator::<const T>::type
是const_iterator
的(如果基础容器具有此类成员类型(,而不是iterator
,因此无法通过此迭代器修改容器。
这是否意味着Range<const T>
也使用const_iterators
来遍历范围?
显然,确保值不被修改的正确方法都不是我提到的那些。
从 Boost.Range 的文档可以看出,any_range
采用以下模板参数:
template<
class Value
, class Traversal
, class Reference
, class Difference
, class Buffer = any_iterator_default_buffer
>
class any_range;
我强烈怀疑声明"const 范围"的方法是将const T
指定为 Reference
类型模板参数,尽管令人惊讶的是,我仍然无法在文档中找到任何明确的迹象。
因此,常量范围可以声明为:
template<class C>
using ConstRange = boost::any_range<C, boost::forward_traversal_tag, const C, std::ptrdiff_t>