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_buffer
和any_iterator_stack_only_buffer<StackSize>
。
(来源:我通过阅读源代码获得了所有这些信息)