std::ranges::views::repeat, std::ranges::repeat_view
| 定义于头文件 <ranges> |
||
| template< std::move_constructible W, std::semiregular Bound = std::unreachable_sentinel_t > |
(1) | (C++23 起) |
| namespace views { inline constexpr /* unspecified */ repeat = /* unspecified */; |
(2) | (C++23 起) |
| 调用签名 (Call signature) |
||
| template< class W > requires /* 见下文 */ |
(C++23 起) | |
| template< class W, class Bound > requires /* 见下文 */ |
(C++23 起) | |
| 辅助概念 |
||
concept /*integer-like-with-usable-difference-type*/ = /*is-signed-integer-like*/<T> || |
(3) | (仅作说明*) |
repeat_view 实现了 random_access_range。如果 Bound 不是 std::unreachable_sentinel_t,则 repeat_view 也实现了 sized_range 和 common_range。
目录 |
自定义点对象
名称 views::repeat 表示一个 *自定义点对象*,它是一个常量 函数对象,属于一个 字面量 semiregular 类类型。为便于说明,其类型的不带 cv 限定版本表示为 __repeat_fn。
所有 __repeat_fn 的实例都相等。在相同参数上调用不同 __repeat_fn 类型的实例的效果是等价的,无论表示该实例的表达式是左值还是右值,以及是否带有 const 限定(但是,不要求可调用 volatile 限定的实例)。因此,views::repeat 可以自由复制,并且其副本可以互换使用。
给定一组类型 Args...,如果 std::declval<Args>()... 满足上述 views::repeat 参数的要求,则 __repeat_fn 实现了
- std::invocable<__repeat_fn, Args...>,
- std::invocable<const __repeat_fn, Args...>,
- std::invocable<__repeat_fn&, Args...>,以及
- std::invocable<const __repeat_fn&, Args...>.
否则,__repeat_fn 的任何函数调用运算符都不参与重载解析。
[编辑] 数据成员
| 成员 | 定义 |
movable-box <W> value_ |
视图的重复元素 (仅用于阐释的成员对象*) |
Bound bound_ |
哨兵值 (仅用于阐释的成员对象*) |
[编辑] 成员函数
创建一个 repeat_view(公开成员函数) | |
获取 repeat_view 的起始迭代器(公开成员函数) | |
获取表示 repeat_view 结束的哨兵(公开成员函数) | |
如果 repeat_view 是有大小的,则获取其大小(公开成员函数) | |
继承自 std::ranges::view_interface | |
返回派生视图是否为空,仅在它满足 sized_range 或 forward_range 时提供( std::ranges::view_interface<D> 的公共成员函数) | |
| (C++23) |
返回范围开头的常量迭代器 ( std::ranges::view_interface<D> 的公共成员函数) |
| (C++23) |
返回范围常量迭代器的哨兵 ( std::ranges::view_interface<D> 的公共成员函数) |
| 返回派生视图是否非空,仅当 ranges::empty 适用于它时提供 ( std::ranges::view_interface<D> 的公共成员函数) | |
返回派生视图中的第一个元素,如果它满足 forward_range 则提供( std::ranges::view_interface<D> 的公共成员函数) | |
返回派生视图中的最后一个元素,仅在它满足 bidirectional_range 和 common_range 时提供( std::ranges::view_interface<D> 的公共成员函数) | |
返回派生视图中的第 n 个元素,仅当它满足 random_access_range 时提供( std::ranges::view_interface<D> 的公共成员函数) | |
std::ranges::repeat_view::repeat_view
| repeat_view() requires std::default_initializable<W> = default; |
(1) | (C++23 起) |
| constexpr explicit repeat_view( const W& value, Bound bound = Bound() ); |
(2) | (C++23 起) |
| constexpr explicit repeat_view( W&& value, Bound bound = Bound() ); |
(3) | (C++23 起) |
| template < class... WArgs, class... BoundArgs > requires std::constructible_from<W, WArgs...> |
(4) | (C++23 起) |
value_,并用 std::make_from_tuple<Bound>(std::move(bound_args)) 初始化 bound_。参数
| value | - | 要重复生成的值 |
| bound | - | 边界 |
| value_args | - | 包含 value_ 初始化器的元组 |
| bound_args | - | 包含 bound_ 初始化器的元组 |
std::ranges::repeat_view::begin
| constexpr /*iterator*/ begin() const; |
(C++23 起) | |
返回 iterator (std::addressof(*value_ ))。
std::ranges::repeat_view::end
| constexpr /*iterator*/ end() const requires (!std::same_as<Bound, std::unreachable_sentinel_t>); |
(1) | (C++23 起) |
| constexpr std::unreachable_sentinel_t end() const; |
(2) | (C++23 起) |
iterator (std::addressof(*value_ ), bound_ )。
std::ranges::repeat_view::size
| constexpr auto size() const requires (!std::same_as<Bound, std::unreachable_sentinel_t>); |
(C++23 起) | |
返回 to-unsigned-like (bound_ )。
[编辑] 推导指南
| template< class W, class Bound = std::unreachable_sentinel_t > repeat_view( W, Bound = Bound() ) -> repeat_view<W, Bound>; |
(C++23 起) | |
[编辑] 嵌套类
| 迭代器类型 (仅用于说明的成员类*) |
[编辑] 注解
| 特性测试宏 | 值 | 标准 | 特性 |
|---|---|---|---|
__cpp_lib_ranges_repeat |
202207L |
(C++23) | std::ranges::repeat_view
|
[编辑] 示例
#include <iostream> #include <ranges> #include <string_view> using namespace std::literals; int main() { // bounded overload for (auto s : std::views::repeat("C++"sv, 3)) std::cout << s << ' '; std::cout << '\n'; // unbounded overload for (auto s : std::views::repeat("I know that you know that"sv) | std::views::take(3)) std::cout << s << ' '; std::cout << "...\n"; }
输出
C++ C++ C++ I know that you know that I know that you know that I know that you know that ...
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
|---|---|---|---|
| LWG 4053 | C++20 | 对 views::repeat 的一元调用未衰减参数 |
衰减参数 |
| LWG 4054 | C++20 | 使用 repeat_view 调用 views::repeat未创建嵌套的 repeat_view |
创建嵌套的repeat_view
|
[编辑] 另请参阅
| (C++20) |
由重复递增初始值生成的序列组成的 view(类模板) (自定义点对象) |