Namespaces
Variants

std:: extent

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
ヘッダーで定義 <type_traits>
template < class T, unsigned N = 0 >
struct extent ;
(C++11以降)

T が配列型の場合、メンバ定数 value を配列の N 次元に沿った要素数に等しい値として提供します。ただし N [ 0 , std:: rank < T > :: value ) の範囲内にある場合に限ります。その他の型の場合、または T が最初の次元で境界が不明な配列であり N 0 である場合、 value 0 となります。

プログラムが std::extent または std::extent_v (C++17以降) に対する特殊化を追加する場合、動作は未定義です。

目次

ヘルパー変数テンプレート

template < class T, unsigned N = 0 >
constexpr std:: size_t extent_v = extent < T, N > :: value ;
(C++17以降)

std:: integral_constant から継承

メンバ定数

value
[static]
T N 次元に沿った要素数
(public static member constant)

メンバ関数

operator std::size_t
オブジェクトを std:: size_t に変換し、 value を返す
(public member function)
operator()
(C++14)
value を返す
(public member function)

メンバ型

定義
value_type std:: size_t
type std:: integral_constant < std:: size_t , value >

実装例

template<class T, unsigned N = 0>
struct extent : std::integral_constant<std::size_t, 0> {};
template<class T>
struct extent<T[], 0> : std::integral_constant<std::size_t, 0> {};
template<class T, unsigned N>
struct extent<T[], N> : std::extent<T, N - 1> {};
template<class T, std::size_t I>
struct extent<T[I], 0> : std::integral_constant<std::size_t, I> {};
template<class T, std::size_t I, unsigned N>
struct extent<T[I], N> : std::extent<T, N - 1> {};

#include <type_traits>
static_assert(
    std::extent_v<int[3]> == 3 && // デフォルトの次元は0
    std::extent_v<int[3], 0> == 3 && // 上記と同じ
    std::extent_v<int[3][4], 0> == 3 &&
    std::extent_v<int[3][4], 1> == 4 &&
    std::extent_v<int[3][4], 2> == 0 &&
    std::extent_v<int[]> == 0
);
int main()
{
    const auto ext = std::extent<int['*']>{};
    static_assert(ext == 42); // std::size_tへの暗黙変換あり
    const int ints[]{1, 2, 3, 4};
    static_assert(std::extent_v<decltype(ints)> == 4); // 配列サイズ
    [[maybe_unused]] int ary[][3] = {{1, 2, 3}};
    // ary[0]は'int[3]'への参照型なので、extentは
    // 正しく計算できず0を返す
    static_assert(std::is_same_v<decltype(ary[0]), int(&)[3]>);
    static_assert(std::extent_v<decltype(ary[0])> == 0);
    // 参照を除去すると正しいextent値3が得られる
    static_assert(std::extent_v<std::remove_cvref_t<decltype(ary[0])>> == 3);
}

関連項目

(C++11)
型が配列型かどうかをチェックする
(クラステンプレート)
(C++11)
配列型の次元数を取得する
(クラステンプレート)
指定された配列型から1つの次元を除去する
(クラステンプレート)
指定された配列型からすべての次元を除去する
(クラステンプレート)
(C++23)
あるランクの多次元インデックス空間の記述子
(クラステンプレート)