最終更新日時: 2026年03月31日 20時30分41秒 (JST)
yoh が更新

履歴 編集

function template
<mdspan>

# std::layout_stride::mapping::submdspan_mapping(C++26)

    template<class... SliceSpecifiers>
    constexpr auto submdspan-mapping-impl(  // exposition only
      SliceSpecifiers... slices) const -> see below;

    template<class... SliceSpecifiers>
    friend constexpr auto submdspan_mapping(
      const mapping& src, SliceSpecifiers... slices)
    {
      return src.submdspan-mapping-impl(slices...);
    }

## 概要

`submdspan`関数をサポートするためのカスタマイゼーションポイント。

## テンプレートパラメータ制約

`sizeof...(SliceSpecifiers)`が`Extents::rank()`と等しいこと。

## 適格要件

`extents()`の各次元インデクス`k`において、`SliceSpecifiers...[k]`が`Extents`のk番目次元の有効`submdspan`スライス型(valid `submdspan` slice type)であること。

## 事前条件

`extents()`の各次元インデクス`k`において、`slices...[k]`が`extents()`のk番目次元の有効スライスであること。

## 戻り値

説明用の値や型を次の通り定義する。

- 値`sub_ext` : 式`submdspan_extents(extents(), slices...)`の結果
- 型`SubExtents` : `decltype(sub_ext)`
- 値`sub_strides` : `slices...[k]`の型が縮約スライス型(collapsing slice type)ではない`extents()`の各次元インデクス`k`において`sub_strides[MAP_RANK(slices, k)]`が下記を満たす、`array<SubExtents::index_type, SubExtents::rank()>`型の配列値
  - 説明用の`s`を`slices...[k]`としたとき、`s`の型が`strided_slice`の特殊化かつ`s.stride < s.extent`の場合、`stride(k) * s.stride`
  - そうでなければ、`stride(k)`
- パック`ls` : `extents()`の次元`r`に対して、`r`番目の要素が`slices...[r]`の`submdspan`スライス範囲の下限に等しい`index_type`型の値パック
- 値`offset` : `extents()`における任意の次元インデクス`k`に対して`ls...[k]`が`extents().extent(k)`と等しいとき、`required_span_size()`に等しい`size_t`型の値。そうでなければ、`operator()`に等しい`size_t`型の値。

説明専用の`submdspan-mapping-impl`関数テンプレートは下記の値を返す。

- `Extents::rank() == 0`のとき、`submdspan_mapping_result{*this, 0}`
- `submdspan_mapping_result{layout_stride::mapping(sub_ext, sub_strides), offset}`

## バージョン

### 言語

- C++26

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??

## 関連項目

- `submdspan`

## 参照

- P2630R4 Submdspan
- P3663R3 Future-proof `submdspan_mapping`