最終更新日時(UTC):
が更新

履歴 編集

class template
<mdspan>

std::extents

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

処理系

関連項目

参照