1

使用时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?


编辑

文档中,显然元函数通过用而不是声明范围来range_iterator“推断”const底层容器的特性。即是(如果底层容器有这样的成员类型),而不是,所以容器不能通过这个迭代器进行修改。const TTrange_iterator::<const T>::typeconst_iteratoriterator

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

4

1 回答 1

0

显然,确保值不被修改的正确方法不是我提到的那些。

Boost.Range 的文档中,我们可以看到它any_range采用以下模板参数:

template<
    class Value
  , class Traversal
  , class Reference
  , class Difference
  , class Buffer = any_iterator_default_buffer
>
class any_range;

我强烈怀疑声明“const range”的方法是指定const T类型Reference模板参数,尽管令人惊讶的是,我仍然无法在文档中找到任何明确的指示。

所以一个 const 范围可以声明为:

template<class C>
using ConstRange = boost::any_range<C, boost::forward_traversal_tag, const C, std::ptrdiff_t>
于 2019-03-24T10:17:57.020 回答