我一直在网上寻找一些关于boost::any_range
的有据可查的参考资料,但我所找到的只是一个official source,它只给出了any_range
的简要解释,并给出了一些基本的签名。我正在寻找一些能详细解释它的东西。any_range
的基本模板如下所示:
template<
class Value
, class Traversal
, class Reference
, class Difference
, class Buffer = any_iterator_default_buffer
>
class any_range;
每个模板参数的含义是什么,它可以包含哪些值?
1条答案
按热度按时间lmvvr0a81#
any_range
是一个类型擦除的容器,它允许您存储至少具有您提供的模板参数所需功能的范围。它基于
any_iterator
,您可以在this article中找到详细信息。请注意,文档中的模板参数缺少一些默认参数,这些默认参数在代码本身中。
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>
。(来源:我通过阅读源代码获得了所有这些内容)