std::ranges::out_value_result
来自cppreference.com
| 在标头 <algorithm> 定义
|
||
| template< class O, class T > struct out_value_result; |
(C++23 起) | |
ranges::out_value_result 是类模板,提供了将迭代器和值作为一个单元存储的方法。
除了下面显示的成员外,此类模板没有其他基类或数据成员,从而它适用于结构化绑定。
此类模板的所有特殊成员函数均为隐式声明,这使得所有特化都为聚合类,并传播数据成员上相应的操作的平凡性、潜在抛出性及 constexpr 性质。
目录 |
[编辑] 模板形参
| O, T | - | ranges::out_value_result 储存的对象的类型。
|
[编辑] 数据成员
| 成员名字 | 定义 |
| out |
O 类型的值(假定为迭代器)。 (公开成员对象) |
| value |
T 类型的值(假定为存储的值)。 (公开成员对象) |
这些成员都被声明为带有 [[no_unique_address]] 属性。
[编辑] 成员函数
std::ranges::out_value_result::operator out_value_result<O2, T2>
| template<class O2, class T2> requires convertible_to<const O&, O2> && convertible_to<const T&, T2> |
(1) | |
| template<class O2, class T2> requires convertible_to<O, O2> && convertible_to<T, T2> |
(2) | |
通过从 *this 的对应成员构造结果的每个数据成员,将 *this 转换为结果。
1) 等价于 return {out, value};。
2) 等价于 return {std::move(out), std::move(value)};。
[编辑] 标准库
这些标准库函数使用 ranges::out_value_result 作为返回值类型:
算法函数 | |
| (C++23) |
从初始值开始连续递增填充范围 (算法函数对象) |
[编辑] 概要
namespace std::ranges { template<class O, class T> struct out_value_result { [[no_unique_address]] O out; [[no_unique_address]] T value; template<class O2, class T2> requires convertible_to<const O&, O2> && convertible_to<const T&, T2> constexpr operator out_value_result<O2, T2>() const & { return {out, value}; } template<class O2, class T2> requires convertible_to<O, O2> && convertible_to<T, T2> constexpr operator out_value_result<O2, T2>() && { return {std::move(out), std::move(value)}; } }; }
[编辑] 注解
每个使用这一族返回类型的标准库算法都声明了新的别名类型,例如 using merge_result = in_in_out_result<I1, I2, O>;。
这些别名的名称由算法名添加 “_result”组成。故 std::ranges::merge 的返回类型命名为 std::ranges::merge_result。
不同于 std::pair 和 std::tuple,此类模板的拥有名字有意义的数据成员。
[编辑] 示例
运行此代码
#include <algorithm> #include <array> #include <cassert> #include <numeric> #include <ranges> int main() { std::array<int, 4> a {}; constexpr std::array expected {2, 3, 4, 5}; const auto result = std::ranges::iota(a, 2); assert(std::ranges::distance(a.cbegin(), result.out) == 4); assert(result.value == 6); assert(a == expected); }
[编辑] 参阅
| 实现二元组,即一对值 (类模板) | |
| (C++11) |
实现固定大小的容器,可保有类型相异的元素 (类模板) |