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};
}
xxxxxxxxxx
#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_type
inmdspan
- P2389R2
dextents
Index Type Parameter- C++26から、エイリアステンプレート
dims
が追加される。
- C++26から、エイリアステンプレート