std::ranges::views::single, std::ranges::single_view
| 定义于头文件 <ranges>
|
||
template< std::copy_constructible T >
requires std::is_object_v<T>
class single_view
: public ranges::view_interface<single_view<T>>
|
(1) | (C++20 起) (直到 C++23) |
template< std::move_constructible T >
requires std::is_object_v<T>
class single_view
: public ranges::view_interface<single_view<T>>
|
(C++23 起) | |
namespace views {
inline constexpr /* unspecified */ single = /* unspecified */;
}
|
(2) | (C++20 起) |
| 调用签名 |
||
template< class T >
requires /* see below */
constexpr /* see below */ single( T&& t );
|
(C++20 起) | |
元素的生存期绑定到父级 single_view。复制 single_view 会复制该元素。
定制点对象
名称
views::single
表示一个
定制点对象
,这是一个常量
函数对象
,属于
字面量
的
semiregular
类类型。详情请参阅
定制点对象
。
数据成员
| 成员 | 描述 | ||||
value_
|
视图的单个元素 (仅用于阐释的成员对象*) |
成员函数
构造一个
single_view
(公开成员函数) |
|
|
返回指向元素的指针
(公开成员函数) |
|
|
返回指向元素末尾的指针
(公开成员函数) |
|
|
[static]
|
返回
false
(公开静态成员函数) |
|
[static]
|
返回
1
(公开静态成员函数) |
|
返回指向元素的指针
(公开成员函数) |
|
继承自 ranges::view_interface | |
(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::single_view:: single_view
|
single_view
(
)
requires
std::
default_initializable
<
T
>
=
default
;
|
(1) | (since C++20) |
| (2) | ||
|
constexpr
explicit
single_view
(
const
T
&
t
)
;
|
(since C++20)
(until C++23) |
|
|
constexpr
explicit
single_view
(
const
T
&
t
)
requires std:: copy_constructible < T > ; |
(since C++23) | |
|
constexpr
explicit
single_view
(
T
&&
t
)
;
|
(3) | (since C++20) |
|
template
<
class
...
Args
>
requires
std::
constructible_from
<
T, Args...
>
|
(4) | (since C++20) |
构造一个
single_view
。
value_
,这会值初始化其包含的值。
value_
。
value_
。
std::ranges::single_view:: begin
|
constexpr
T
*
begin
(
)
noexcept
;
constexpr const T * begin ( ) const noexcept ; |
(since C++20) | |
等价于 return data ( ) ; 。
std::ranges::single_view:: end
|
constexpr
T
*
end
(
)
noexcept
;
constexpr const T * end ( ) const noexcept ; |
(since C++20) | |
等价于 return data ( ) + 1 ; 。
std::ranges::single_view:: empty
|
static
constexpr
bool
empty
(
)
noexcept
;
|
(since C++20) | |
等价于 return false ; 。
std::ranges::single_view:: size
|
static
constexpr
std::
size_t
size
(
)
noexcept
;
|
(since C++20) | |
等价于 return 1 ; 。
使
single_view
满足
/*tiny-range*/
要求,该要求由
split_view
提出。
std::ranges::single_view:: data
|
constexpr
T
*
data
(
)
noexcept
;
constexpr const T * data ( ) const noexcept ; |
(since C++20) | |
返回指向
value_
所包含值的指针。若
value_
未包含值,则行为未定义。
推导指引
|
template
<
class
T
>
single_view ( T ) - > single_view < T > ; |
(C++20 起) | |
注释
对于
single_view
,继承的
empty
成员函数始终返回
false
,而继承的
operator
bool
转换函数始终返回
true
。
示例
#include <iomanip> #include <iostream> #include <ranges> #include <string> #include <tuple> int main() { constexpr std::ranges::single_view sv1{3.1415}; // 使用 (const T&) 构造函数 static_assert(sv1); static_assert(not sv1.empty()); std::cout << "1) *sv1.data(): " << *sv1.data() << '\n' << "2) *sv1.begin(): " << *sv1.begin() << '\n' << "3) sv1.size(): " << sv1.size() << '\n' << "4) distance: " << std::distance(sv1.begin(), sv1.end()) << '\n'; std::string str{"C++20"}; std::cout << "5) str = " << std::quoted(str) << '\n'; std::ranges::single_view sv2{std::move(str)}; // 使用 (T&&) 构造函数 std::cout << "6) *sv2.data(): " << std::quoted(*sv2.data()) << '\n' << "7) str = " << std::quoted(str) << '\n'; std::ranges::single_view<std::tuple<int, double, std::string>> sv3{std::in_place, 42, 3.14, "😄"}; // 使用 (std::in_place_t, Args&&... args) std::cout << "8) sv3 holds a tuple: { " << std::get<0>(sv3[0]) << ", " << std::get<1>(sv3[0]) << ", " << std::get<2>(sv3[0]) << " }\n"; }
输出:
1) *sv1.data(): 3.1415
2) *sv1.begin(): 3.1415
3) sv1.size(): 1
4) distance: 1
5) str = "C++20"
6) *sv2.data(): "C++20"
7) str = ""
8) sv3 holds a tuple: { 42, 3.14, 😄 }
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用标准 | 发布时行为 | 修正后行为 |
|---|---|---|---|
| LWG 3428 | C++20 |
single_view
可从
std::in_place_t
转换
|
构造函数改为显式 |
| LWG 4035 | C++20 |
single_view
未提供成员函数
empty()
|
提供
empty()
|
| P2367R0 | C++20 |
single_view
的推导指引未能对实参进行退化处理;
views::single
复制但未包装
single_view
|
提供退化处理指引;
改为始终包装 |
参见
|
(C++17)
|
可容纳或可不容纳对象的包装器
(类模板) |
|
(C++20)
|
无元素的空
view
(类模板) (变量模板) |
|
(C++20)
|
通过分隔符拆分另一个
view
所获子范围的
view
(类模板) (范围适配器对象) |