namespace std {
template<class IndexType, size_t... Extents>
class extents;
template<class IndexType, size_t Rank>
using dextents = see below;
template<size_t Rank, class IndexType = size_t>
using dims = see below; // C++26以降
}
概要
extentsは、多次元配列の次元数(rank)と各次元の要素数(extent)を表現する。
多次元配列ビューstd::mdspanに対して、多次元配列のサイズを指示するために用いる。
extentsの特殊化はregularのモデルであり、かつトリビアルコピー可能である。
要素数の動的/静的指定
多次元配列における次元の要素数が静的(コンパイル時)または動的(プログラム実行時)いずれのタイミングで決定するかを、各次元毎に指定する。
- 多次元配列の次元数は
sizeof...(Extents)に等しい Extents要素がdynamic_extentに等しい次元は、動的要素数(dynamic extent)となるExtents要素がコンパイル時に整数値指定された次元は、静的要素数(static extent)となる
extentsは、下記の説明専用メンバ変数を保持する。
array<IndexType, rank_dynamic()> dynamic-extents;
extentsオブジェクトサイズ最小化のため、動的要素数次元のサイズ情報のみをIndexType型配列として管理する。
動的要素数次元のサイズ情報は非型テンプレートパラメータとして型情報に埋め込まれるため、プログラム実行時のメモリ使用量には影響しない。
エイリアステンプレート
エイリアステンプレートdextentsは、次元数Rankかつ全次元が動的要素数で指定されるextentsを生成する。
例えばdextents<size_t, 2>はextents<size_t, dynamic_extent, dynamic_extent>の略記となる。
C++26では、テンプレートパラメータIndexTypeがデフォルト引数size_tをもつエイリアステンプレートdimsが追加される。
例えばdims<2>はdextents<size_t, 2>と等価であり、extents<size_t, dynamic_extent, dynamic_extent>の略記となる。
適格要件
IndexTypeは符号付き整数型または符号無し整数型Extentsの各要素はdynamic_extentに等しい、またはIndexType型で表現可能な値
メンバ関数
| 名前 | 説明 | 対応バージョン |
|---|---|---|
(constructor) |
コンストラクタ | C++23 |
(destructor) |
デストラクタ | C++23 |
rank |
多次元配列の次元数を取得する | C++23 |
rank_dynamic |
多次元配列のうち動的要素数に指定された次元数を取得する | C++23 |
static_extent |
指定次元の静的要素数を取得する | C++23 |
extent |
指定次元の要素数を取得する | C++23 |
メンバ型
| 名前 | 説明 | 対応バージョン |
|---|---|---|
index_type |
IndexType |
C++23 |
size_type |
make_unsigned_t<IndexType> |
C++23 |
rank_type |
size_t |
C++23 |
比較演算子
| 名前 | 説明 | 対応バージョン |
|---|---|---|
operator== |
等値比較 | C++23 |
operator!= |
非等値比較 (==により使用可能) |
C++23 |
推論補助
| 名前 | 説明 | 対応バージョン |
|---|---|---|
(deduction_guide) |
クラステンプレートの推論補助 | C++23 |
例
#include <mdspan>
int main()
{
// 固定要素数 3x3 の2次元配列サイズ
std::extents<size_t, 3, 3> ext3x3;
#if 1
// 動的要素数からなる2次元配列サイズを 4x2 で初期化
std::dextents<size_t, 2> ext2d{4, 2};
#else
// C++26: dims<2>はdextents<size_t, 2>と等価
std::dims<2> ext2d{4, 2};
#endif
// 2個の動的要素数(高さ,幅)と静的要素数(RGBA=4)からなる3次元配列サイズ
using ColorImageExt = std::extents<size_t, std::dynamic_extent, std::dynamic_extent, 4>;
ColorImageExt image_ext{128, 128};
}
出力
バージョン
言語
- C++23
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??
関連項目
参照
- P0009R18 MDSPAN
- P2599R2
index_type&size_typeinmdspan - P2389R2
dextentsIndex Type Parameter- C++26から、エイリアステンプレート
dimsが追加される。
- C++26から、エイリアステンプレート