C++ 具名要求:布局映射 (LayoutMapping) (C++23 起)

来自cppreference.com
< cpp‎ | named req


 
 
C++ 具名要求
 

布局映射 (LayoutMapping) 控制 std::mdspan 中从多维索引到数据句柄的一维偏移量的映射。

要求

如果类型 M 实现了 copyableequality_comparable,而且以下各项均为 true,则它满足布局映射 (LayoutMapping)

并且,给定以下各类型和值,下表所示的表达式均有效并具有所指定的语义:

凡例

类型 定义
M 布局映射类
定义
m (可能 const 限定的)M 类型的值
i, j (可能 const 限定的)整数包,为 m.extents() 中的多维索引
r typename M​::​extents_type 的(可能 const 限定的)秩索引
d_r (可能 const 限定的)整数包,满足 sizeof...(d_r) == M​::​extents_type​::​rank()true,位于秩索引 r 的元素等于 1,且其他所有元素都等于 0

成员类型

名称 类型 要求
M::extents_type 类模板 std::extents 的特化
M::index_type typename M::extents_type::index_type
M::rank_type typename M::extents_type::rank_type
M::layout_type 布局映射策略 MP,其中 typename MP::template mapping<E> 对于尺度类型 EM 布局映射策略 (LayoutMappingPolicy) ,满足 MMP 的映射类型

成员函数与运算符

表达式 返回类型 语义
m.extents() const typename M​::​extents_type& 返回到关联的多维索引空间的常量引用
m(i...) typename M​::​index_type
m.required_span_size() typename M​::​index_type
  • 如果多维索引空间 m.extents() 不是 0,则返回 1 加上 m(i...) 对于所有 i 的最大值。
  • 否则,返回 0
m.is_unique() bool 仅当对于满足 (i != j || ...)true 的所有 ijm(i...) != m(j...) 都为 true 时,返回 true[note 1]
m.is_exhaustive() bool 仅当对于范围 [0m.required_span_size()) 中的每个 k 都存在一个 i 使得 m(i...) 等于 k 时,返回 true[note 2]
m.is_strided() bool 仅当对于 m.extents() 的每个秩索引 r 都存在一个整数 s_r,使得对于满足 (i + d_r)m.extents() 中的多维索引的每个 im((i + d_r)...) - m(i...) 都等于 s_r 时,返回 true[note 3]
m.stride(r) typename M​::​index_type
  • 前条件是 m.is_strided()true
  • 返回如上述 m.is_strided() 中秩索引 r 处的步长 s_r
M::is_always_unique() bool
  • 仅当对于 M 类型的所有可能对象 mm.is_unique() 都为 true 时,返回 true[note 4]
  • 返回值总是常量表达式。
M::is_always_exhaustive() bool
  • 仅当对于 M 类型的所有可能对象 mm.is_exhaustive() 都为 true 时,返回 true[note 5]
  • 返回值总是常量表达式。
M::is_always_strided() bool
  • 仅当对于 M 类型的所有可能对象 mm.is_strided() 都为 true 时,返回 true[note 6]
  • 返回值总是常量表达式。
  1. 即便满足条件,映射也可以返回 false。对于某些布局,高效地确定布局是否唯一可能并不可行。
  2. 同上,但此为穷尽布局的情形。
  3. 同上,但此为跨步布局的情形。
  4. 即便满足条件,映射也可以返回 false。对于某些布局映射,高效地确定每个实例是否唯一可能并不可行。
  5. 同上,但此为穷尽实例的情形。
  6. 同上,但此为跨步实例的情形。

参阅

layout_left 的布局映射
(std::layout_left 的公开成员类模板)
layout_right 的布局映射
(std::layout_right 的公开成员类模板)
layout_stride 的布局映射
(std::layout_stride 的公开成员类模板)
layout_left_padded 布局映射
(std::layout_left_padded<PaddingValue> 的公开成员类模板)
layout_right_padded 布局映射
(std::layout_right_padded<PaddingValue> 的公开成员类模板)