boost::any_range中的模板参数是什么意思?

3
我一直在搜索一些关于像boost::any_range这样的东西的文档参考,但我所找到的只有一个官方来源,它只是简要解释了any_range的内容并提供了一些基本签名。我正在寻找一些能够详细解释它的东西。 any_range的基本模板如下:
template<
    class Value
  , class Traversal
  , class Reference
  , class Difference
  , class Buffer = any_iterator_default_buffer
>
class any_range;

每个模板参数的含义是什么,它可以容纳哪些值?

1个回答

3

any_range是一种类型擦除的容器,允许您存储至少具有您提供的模板参数所需的能力的范围。

它基于any_iterator,您可以在这篇文章中找到详细信息。

请注意,文档中的模板参数缺少代码本身中的一些默认参数。真正的定义如下:

template<
    class Value
  , class Traversal
  , class Reference = Value&
  , class Difference = std::ptrdiff_t
  , class Buffer = use_default
>
class any_range

Value参数指定范围公开的元素类型。因此,any_range<int,...>可以存储std::vector<int>std::list<int>等。

Traversal参数指定允许的范围类别,例如随机访问、前向、输入。它可以是iterator_categories中的选项之一。一个any_range<int, random_access_tag, ...>将能够存储std::vector<int>,但不能存储std::list<int>,因为std::list只是双向的,而不是随机访问的。

Reference参数指示在对范围的迭代器进行解引用时应返回哪种类型。它默认为Value&,对于大多数情况来说都可以。 (如果您的范围返回代理引用(例如std::vector<bool>),则不适用于其中一种情况)

Difference表示从范围中减去另一个迭代器时应返回哪种类型,以获取它们之间的差异。这默认为std::ptrdiff_t,对于大多数情况也是可以的。

最后,Buffer参数指示如何存储底层类型擦除的范围。这默认为any_iterator_default_buffer,只要它小于64字节,就将底层范围存储在any_range对象内部。否则,它会堆分配。此选项的其他选项包括any_iterator_buffer<MaxStackSize>any_iterator_heap_only_bufferany_iterator_stack_only_buffer<StackSize>

(来源:我通过阅读源代码获得了所有这些信息)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接