声明“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;

我怀疑第一个版本是正确的。但是,如果我应用任何boost::adaptors,是否可以保证保持容器的const性?


编辑

从文档中可以看出,显然range_iterator元函数通过使用const T而不是T声明范围来"推断"底层容器的const性。也就是说,range_iterator::<const T>::typeconst_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>

相关内容

  • 没有找到相关文章

最新更新