std::ranges::out_value_result

来自cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
受约束算法
不修改序列的操作
修改序列的操作
划分操作
排序操作
二分搜索操作
集合操作(在已排序范围上)
堆操作
最小/最大操作
排列
未初始化存储上的操作
返回类型
 
 
在标头 <algorithm> 定义
template< class I, class T >
struct out_value_result;
(C++23 起)

ranges::out_value_result 是类模板,提供了将迭代器和值作为一个单元存储的方法。

除了下面显示的成员外,此类模板没有其他基类或数据成员,从而它适用于结构化绑定

此类模板的所有特殊成员函数均为隐式声明,这使得所有特化都为聚合类,并传播数据成员上相应的操作的平凡性、潜在抛出性及 constexpr 性质。

模板形参

O, T - ranges::out_value_result 储存的对象的类型。

数据成员

std::ranges::out_value_result::out

[[no_unique_address]] O out;

值(应为迭代器)

std::ranges::out_value_result::value

[[no_unique_address]] T value;

值(应为储存的结果值)

成员函数

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>

constexpr operator out_value_result<O2, T2>() const &;
(1)
template<class O2, class T2>

requires convertible_to<O, O2> && convertible_to<T, T2>

constexpr operator out_value_result<O2, T2>() &&;
(2)

通过从 *this 的对应成员构造结果的每个数据成员,将 *this 转换为结果。

1) 等价于 return {out, value};
2) 等价于 return {std::move(out), std::move(value)};

标准库

这些标准库函数使用 ranges::out_value_result 作为返回值类型:

算法函数
用从起始值开始连续递增的值填充一个范围
(niebloid)

概要

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::pairstd::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)
实现固定大小的容器,它保有类型可以相异的元素
(类模板)