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

履歴 編集

class template
<mdspan>

# std::layout_stride::mapping(C++23)

    namespace std {
      template<class Extents>
      class layout_stride::mapping;
    }

## 概要

`layout_stride::mapping<E>`は、`extents`型の多次元配列サイズ`E`をパラメータとして、次元毎に任意ストライド幅を指定したレイアウトマッピングを表現するクラスである。

`layout_stride::mapping<E>`はトリビアルコピー可能であり、`regular`のモデルである。

### 説明専用メンバ変数

`layout_stride::mapping`クラステンプレートは、下記の説明専用メンバ変数を保持する。

- `extents_` : `extents_type`型の多次元配列サイズ情報
- `strides_` : `array<index_type, extents_type::rank()>`型のストライド幅配列

また下記の説明専用静的メンバ変数を保持する。

- `rank_` : `size_t`型の定数`extents_type::rank()`

## 適格要件

- `Extents`は`extents`の特殊化であること。
- `Extents::rank_dynamic() == 0`が`true`のとき、多次元インデクス空間`Extents()`のサイズが`Extents::index_type`型で表現できること。

## メンバ関数

### 構築・破棄

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++23
`(destructor)` | デストラクタ | C++23
`operator=` | コピー代入演算子 | C++23

### 観測

名前 | 説明 | 対応バージョン
--- | --- | ---
`extents` | 多次元配列のサイズ`extents_`を取得する | C++23
`strides` | ストライド配列`strides_`を取得する | C++23
`required_span_size` | 要素アクセス範囲を取得する | C++23
`operator()` | 多次元配列インデクスから要素位置へ変換する | C++23
`is_exhaustive` | Exhaustive特性を取得する | C++23
`stride` | 指定次元のストライド幅を取得する | C++23

## 静的メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`is_always_unique` | `true`を返す | C++23
`is_always_exhaustive` | `false`を返す | C++23
`is_always_strided` | `true`を返す | C++23
`is_unique` | `true`を返す | C++23
`is_strided` | `true`を返す | C++23

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`extents_type` | `Extents` | C++23
`index_type` | `Extents::index_type` | C++23
`size_type` | `Extents::size_type` | C++23
`rank_type` | `Extents::rank_type` | C++23
`layout_type` | `layout_stride` | C++23

## 非メンバ（Hidden friends）関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`submdspan_mapping` | `submdspan`サポート | C++26

### 比較演算子

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator==` | 等値比較 | C++23
`operator!=` | 非等値比較 (`==`により使用可能) | C++23

## 例

    #include <mdspan>
    #include <array>
    #include <iostream>

    int main()
    {
      double arr[] = {1, 2, 3, 0, 4, 5, 6, 0};

      // 要素数2x3の2次元配列／パディングあり行優先レイアウト
      using Ext2x3 = std::extents<size_t, 2, 3>;
      using Mapping = std::layout_stride::mapping<Ext2x3>;
      std::array strides{4, 1};
      std::mdspan mat{arr, Mapping{{}, strides}};

      for (size_t i = 0; i < mat.extent(0); ++i) {
        for (size_t j = 0; j < mat.extent(1); ++j) {
          std::cout << (j ? " " : "") << mat[i, j];
        }
        std::cout << "\n";
      }
    }

### 出力

    1 2 3
    4 5 6

## バージョン

### 言語

- C++23

### 処理系

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

## 関連項目

- `mdspan`
- `submdspan`

## 参照

- P0009R18 MDSPAN
- P2630R4 Submdspan