声明const`boost :: range`s的正确方法

时间:2019-03-22 08:36:04

标签: c++ boost const boost-range

使用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>::typeconst_iterator(如果基础容器具有这种成员类型),而不是iterator,因此无法通过此迭代器修改容器。

这是否意味着Range<const T>也使用const_iterators遍历范围?

1 个答案:

答案 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>