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

问题描述 投票:0回答:1

我一直在网上冲浪寻找像

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;

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

c++ boost type-erasure boost-type-erasure
1个回答
1
投票

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&
,这对大多数情况都很好。 (如果你的范围返回代理引用,那么 not 是可以的,就像
std::vector<bool>
一样)

Difference
指示当您从另一个迭代器中减去一个迭代器的范围时应返回哪种类型,得到它们之间的差异。这默认为
std::ptrdiff_t
,这对于大多数情况也很好。

最后,

Buffer
参数指示如何存储底层类型擦除范围。这默认为
any_iterator_default_buffer
,它将底层范围存储在
any_range
对象中,只要它是 64 字节或更少。否则堆分配它。其他选项是
any_iterator_buffer<MaxStackSize>
any_iterator_heap_only_buffer
any_iterator_stack_only_buffer<StackSize>

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

© www.soinside.com 2019 - 2024. All rights reserved.