• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function
    <mdspan>

    std::extents::コンストラクタ

    constexpr extents() noexcept = default;  // (1)
    
    template<class OtherIndexType, size_t... OtherExtents>
    constexpr explicit(see below)
      extents(const extents<OtherIndexType, OtherExtents...>& other) noexcept;  // (2)
    
    template<class... OtherIndexTypes>
    constexpr explicit extents(OtherIndexTypes... exts) noexcept;  // (3)
    
    template<class OtherIndexType, size_t N>
    constexpr explicit(N != rank_dynamic())
      extents(span<OtherIndexType, N> exts) noexcept;  // (4)
    
    template<class OtherIndexType, size_t N>
    constexpr explicit(N != rank_dynamic())
      extents(const array<OtherIndexType, N>& exts) noexcept;  // (5)
    

    概要

    • (1) : デフォルトコンストラクタ
    • (2) : 他extentsからの変換コンストラクタ
    • (3) : 要素数を値リストで設定するコンストラクタ
    • (4) : 要素数をspanで設定するコンストラクタ
    • (5) : 要素数をarrayで設定するコンストラクタ

    テンプレートパラメータ制約

    • (2) :
      • sizeof...(OtherExtents) == rank()true、かつ
      • ((OtherExtents == dynamic_extent || Extents == dynamic_extent || OtherExtents == Extents) && ...)trueであること
    • (3) : Nsizeof...(OtherIndexTypes)exts_arrarray<index_type, N>{static_cast<index_type>(std:move(exts))...}としたとき
    • (4), (5) :

    事前条件

    • (2) : それぞれr番目の次元が静的要素数に対して要素数がother.extent(r)と等しく、かつ
      • sizeof...(OtherExtents) == 0、もしくは
      • otherの全ての次元rにおいてother.extent(r)index_type型で表現可能な値であること
    • (3) : Nsizeof...(OtherIndexTypes)exts_arrarray<index_type, N>{static_cast<index_type>(std:move(exts))...}としたとき
      • N != rank_dynamic()ならば、それぞれr番目の次元が静的要素数に対して要素数がexts_arr[r]と等しく、かつ
      • sizeof...(exts) == 0もしくはextsの各要素がindex_type型で表現可能な値であること
    • (4), (5) : N != rank_dynamic()ならば、それぞれr番目の次元が静的要素数に対して要素数がexts[r]と等しく、かつ
      • N == 0、もしくは
      • extsの各要素がindex_type型で表現可能な値であること

    効果

    • (4), (5) : 動的要素数に指定された各次元の要素数をextsの値を用いて初期化する。

    事後条件

    • (2) : *this == other
    • (3) : exts_arrarray<index_type, N>{static_cast<index_type>(std:move(exts))...}としたとき、*this == extents(exts_arr)オーバーロード(5)の効果を参照)

    例外

    投げない

    explicitになる条件

    • (2) : (((Extents != dynamic_extent) && (OtherExtents == dynamic_extent)) || ... ) || (numeric_limits<index_type>::max() < numeric_limits<OtherIndexType>::max())
    • (4), (5) : N != rank_dynamic()

    #include <cassert>
    #include <array>
    #include <mdspan>
    #include <span>
    
    using Ext3x4 = std::extents<size_t, 3, 4>;
    using Ext3xN = std::extents<size_t, 3, std::dynamic_extent>;
    
    int main()
    {
      // (1) : デフォルトコンストラクタ
      {
        Ext3x4 ext1_3x4;
        Ext3xN ext1_3xN;
        assert(ext1_3xN.extent(1) == 0);
      }
      // (2) : 変換コンストラクタ
      {
        Ext3x4 ext1_3x4;
        Ext3xN ext1_3xN = ext1_3x4;
        assert(ext1_3xN.extent(1) == 4);
      }
      // (3) : 要素数を値リストで設定するコンストラクタ
      {
        Ext3xN ext3_all{3, 4};  // 全次元を設定
        Ext3xN ext3_dyn{4};     // 動的要素数のみ設定
        assert(ext3_all == ext3_dyn);
      }
      // (4) : 要素数をspanで設定するコンストラクタ
      {
        int exts_all[] = {3, 4};
        int exts_dyn[] = {4};
        Ext3xN ext4_all{ std::span{exts_all} };  // 全次元を設定(explicit)
        Ext3xN ext4_dyn = std::span{exts_dyn};   // 動的要素数のみ設定
        assert(ext4_all == ext4_dyn);
      }
      // (5) : 要素数をarrayで設定するコンストラクタ
      {
        std::array exts_all{3, 4};
        std::array exts_dyn{4};
        Ext3xN ext5_all{ exts_all };  // 全次元を設定(explicit)
        Ext3xN ext5_dyn = exts_dyn;   // 動的要素数のみ設定
        assert(ext5_all == ext5_dyn);
      }
    }
    

    出力

    バージョン

    言語

    • C++23

    処理系

    参照