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