c++ boost::any_range中模板参数的含义是什么?

8cdiaqws  于 2023-03-25  发布在  其他
关注(0)|答案(1)|浏览(143)

我一直在网上寻找一些关于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;

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

lmvvr0a8

lmvvr0a81#

any_range是一个类型擦除的容器,它允许您存储至少具有您提供的模板参数所需功能的范围。
它基于any_iterator,您可以在this article中找到详细信息。
请注意,文档中的模板参数缺少一些默认参数,这些默认参数在代码本身中。

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>
(来源:我通过阅读源代码获得了所有这些内容)

相关问题