std::ranges::views::single, std::ranges::single_view
来自cppreference.com
在标头 <ranges> 定义 | ||
(1) | ||
template<std::copy_constructible T > requires std::is_object_v<T> | (C++20 起) (C++23 前) | |
template<std::move_constructible T > requires std::is_object_v<T> | (C++23 起) | |
namespace views { inlineconstexpr/* 未指定 */ single =/* 未指定 */; | (2) | (C++20 起) |
调用签名 | ||
template<class T > requires /* 见下文 */ | (C++20 起) | |
1) 产生准确含有一个具有指定值的元素的
view
。元素的生存期与父 single_view
绑定。复制 single_view
会产生元素的副本。
目录 |
定制点对象
名字 views::single
代表一个定制点对象,它是某个字面semiregular
类类型的 const 函数对象。 细节参见定制点对象(CustomizationPointObject) 。
[编辑]数据成员
成员名 | 定义 |
copyable-box <T> value_ (C++23 前) | 视图包含的单个元素 (仅用于阐述的成员对象*) |
movable-box <T> value_ (C++23 起) | 视图包含的单个元素 (仅用于阐述的成员对象*) |
[编辑]成员函数
构造 single_view (公开成员函数) | |
返回指向元素的指针 (公开成员函数) | |
返回元素后一位置的指针 (公开成员函数) | |
[静态] | 返回 false (公开静态成员函数) |
[静态] | 返回 1 (公开静态成员函数) |
返回指向元素的指针 (公开成员函数) | |
继承自 std::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) | (C++20 起) |
(2) | ||
constexprexplicit single_view(const T& t ); | (C++20 起) (C++23 前) | |
constexprexplicit single_view(const T& t ) requires std::copy_constructible<T>; | (C++23 起) | |
constexprexplicit single_view( T&& t ); | (3) | (C++20 起) |
template<class... Args> requires std::constructible_from<T, Args...> | (4) | (C++20 起) |
构造 single_view
。
1) 默认初始化
value_
,它会值初始化其所含的值。2) 以 t 初始化
value_
。3) 以 std::move(t) 初始化
value_
。std::ranges::single_view::begin
constexpr T* begin()noexcept; constexprconst T* begin()constnoexcept; | (C++20 起) | |
等价于 return data();。
std::ranges::single_view::end
constexpr T* end()noexcept; constexprconst T* end()constnoexcept; | (C++20 起) | |
等价于 return data()+1;。
std::ranges::single_view::empty
staticconstexprbool empty()noexcept; | (C++20 起) | |
等价于 returnfalse;。
std::ranges::single_view::size
staticconstexprstd::size_t size()noexcept; | (C++20 起) | |
等价于 return1;。
这使得 single_view
实现 split_view
所要求的 /*tiny-range*/。
std::ranges::single_view::data
constexpr T* data()noexcept; constexprconst T* data()constnoexcept; | (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) 距离:"<<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 持有一个元组:{ "<<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) 距离:1 5) str = "C++20" 6) *sv2.data():"C++20" 7) str = "" 8) sv3 持有一个元组:{ 42, 3.14, 😄 }
[编辑]缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 3428 | C++20 | single_view 可从 std::in_place_t 转换 | 使该构造函数为 explicit |
LWG 4035 | C++20 | single_view 没有提供成员函数 empty() | 提供 empty() |
P2367R0 | C++20 | single_view 的推导指引无法衰变参数;views::single 复制但不包装 single_view | 提供衰变的推导指引; 使之始终包装 |
[编辑]参阅
(C++17) | 可能或可能不保有一个对象的包装器 (类模板) |
无元素的空 view (类模板)(变量模板) | |
用某个分隔符切割另一 view 所获得的子范围的 view (类模板)(范围适配器对象) |