std::ranges::in_fun_result
来自cppreference.com
| 在标头 <algorithm> 定义
|
||
| template< class I, class F > struct in_fun_result; |
(C++20 起) | |
ranges::in_fun_result 是类模板,提供存储一个迭代器和一个函数对象为单个单元的方式。
除了下面显示的成员外,此类模板没有其他基类或数据成员,从而它适用于结构化绑定。
此类模板的所有特殊成员函数均为隐式声明,这使得所有特化都为聚合类,并传播数据成员上相应的操作的平凡性、潜在抛出性及 constexpr 性质。
目录 |
[编辑] 模板形参
| I | - | ranges::in_fun_result 存储的迭代器类型
|
| F | - | ranges::in_fun_result 存储的函数对象类型
|
[编辑] 数据成员
| 成员名字 | 定义 |
| in |
I 类型的值(假定为迭代器)。 (公开成员对象) |
| fun |
F 类型的值(假定为函数对象)。 (公开成员对象) |
这些成员都被声明为带有 [[no_unique_address]] 属性。
[编辑] 成员函数
std::ranges::in_fun_result::operator in_fun_result<I2, F2>
| template<class I2, class F2> requires std::convertible_to<const I&, I2> && std::convertible_to<const F&, F2> |
(1) | |
| template<class I2, class F2> requires std::convertible_to<I, I2> && std::convertible_to<F, F2> |
(2) | |
通过从 *this 的每个数据成员构造结果的对应成员,转换 *this 为结果。
1) 等价于 return {in, fun};。
2) 等价于 return {std::move(in), std::move(fun)};。
[编辑] 标准库
下列标准库函数以 ranges::in_fun_result 为返回类型:
算法函数 | |
| (C++20) |
应用一元函数对象到范围中元素 (算法函数对象) |
| (C++20) |
应用函数对象到序列的前 N 个元素 (算法函数对象) |
[编辑] 概要
namespace std::ranges { template<class I, class F> struct in_fun_result { [[no_unique_address]] I in; [[no_unique_address]] F fun; template<class I2, class F2> requires std::convertible_to<const I&, I2> && std::convertible_to<const F&, F2> constexpr operator in_fun_result<I2, F2>() const & { return {in, fun}; } template<class I2, class F2> requires std::convertible_to<I, I2> && std::convertible_to<F, F2> constexpr operator in_fun_result<I2, F2>() && { return {std::move(in), std::move(fun)}; } }; }
[编辑] 注解
每个使用这一族返回类型的标准库算法都声明了新的别名类型,例如 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 <cassert> #include <iostream> #include <iterator> #include <ranges> int main() { int v[]{1, 2, 3}; const std::ranges::in_fun_result res1 = std::ranges::for_each_n( v, std::size(v), [](int& x) { return x = -x; } // 相反数 lambda ); assert(res1.in == std::end(v)); const std::ranges::in_fun_result res2 = std::ranges::for_each( std::begin(v), res1.in, [](int x) { std::cout << x << ' '; } // 打印 lambda ); std::cout << "│ "; std::ranges::for_each(v, res1.fun); // 使用相反数 lambda std::ranges::for_each(v, res2.fun); // 使用打印 lambda std::cout << '\n'; }
输出:
-1 -2 -3 │ 1 2 3
[编辑] 参阅
| 实现二元组,即一对值 (类模板) | |
| (C++11) |
实现固定大小的容器,可保有类型相异的元素 (类模板) |