Namespaces
Variants

Standard library header <mdspan> (C++23)

From cppreference.net
Standard library headers

Cet en-tête fait partie de la bibliothèque de conteneurs .

Table des matières

Classes

(C++23)
une vue de tableau multidimensionnelle non propriétaire
(modèle de classe)
(C++23)
un descripteur d'un espace d'index multidimensionnel d'un certain rang
(modèle de classe)
politique de mappage de disposition de tableau multidimensionnel en colonne principale ; l'étendue la plus à gauche a un pas de 1
(classe)
politique de mappage de disposition de tableau multidimensionnel row-major ; l'étendue la plus à droite a un pas de 1
(classe)
une politique de mappage de disposition avec des pas définis par l'utilisateur
(classe)
politique de mappage de disposition en colonne principale avec un pas de remplissage pouvant être supérieur ou égal à l'étendue la plus à gauche
(modèle de classe)
politique de mappage de disposition row-major avec un pas de remplissage pouvant être supérieur ou égal à l'étendue la plus à droite
(modèle de classe)
un type pour l'accès indexé aux éléments de mdspan
(modèle de classe)
un spécificateur de tranche représentant un ensemble d'indices régulièrement espacés comme indiqué par un décalage, une étendue et un pas
(modèle de classe)
un type de retour des surcharges de submdspan_mapping
(modèle de classe)

Modèles d'alias

(C++23) (C++26)
alias template de commodité pour un std::extents entièrement dynamique
(alias template)

Fonctions

crée de nouvelles dimensions à partir des dimensions existantes et des spécificateurs de tranche
(modèle de fonction)
(C++26)
retourne une vue d'un sous-ensemble d'un mdspan existant
(modèle de fonction)

Étiquettes

un spécificateur de tranche décrivant la plage complète d'indices dans l'étendue spécifiée.
(balise)

Synopsis

// tous freestanding
namespace std {
  // modèle de classe extents
  template<class IndexType, size_t... Extents>
  class extents;
  // alias template dextents
  template<class IndexType, size_t Rank>
  using dextents = /* voir description */;
  // alias template dims
  template<size_t Rank, class IndexType = size_t>
  using dims = /* voir description */;
  // mappage de disposition
  struct layout_left;
  struct layout_right;
  struct layout_stride;
  template<size_t PaddingValue = dynamic_extent>
  struct layout_left_padded;
  template<size_t PaddingValue = dynamic_extent>
  struct layout_right_padded;
  // modèle de classe default_accessor
  template<class ElementType>
  class default_accessor;
  // modèle de classe mdspan
  template<class ElementType,
           class Extents,
           class LayoutPolicy   = layout_right,
           class AccessorPolicy = default_accessor<ElementType>>
  class mdspan;
  // création de submdspan
  template<class OffsetType, class LengthType, class StrideType>
  struct strided_slice;
  template<class LayoutMapping>
  struct submdspan_mapping_result;
  struct full_extent_t
  {
    explicit full_extent_t() = default;
  };
  inline constexpr full_extent_t full_extent{};
  template<class IndexType, class... Extents, class... SliceSpecifiers>
  constexpr auto submdspan_extents(const extents<IndexType, Extents...>&,
                                   SliceSpecifiers...);
  // modèle de fonction submdspan
  template<class ElementType,
           class Extents,
           class LayoutPolicy,
           class AccessorPolicy,
           class... SliceSpecifiers>
  constexpr auto submdspan(
    const mdspan<ElementType, Extents, LayoutPolicy, AccessorPolicy>& src,
    SliceSpecifiers... slices) -> /* voir description */;
  template<class T, class IndexType>
  concept /*index-pair-like*/ = // exposition seulement
    /*pair-like*/<T> && convertible_to<tuple_element_t<0, T>, IndexType> &&
    convertible_to<tuple_element_t<1, T>, IndexType>;
}

Modèle de classe std::mdspan

namespace std {
  template<class ElementType,
           class Extents,
           class LayoutPolicy   = layout_right,
           class AccessorPolicy = default_accessor<ElementType>>
  class mdspan
  {
  public:
    using extents_type     = Extents;
    using layout_type      = LayoutPolicy;
    using accessor_type    = AccessorPolicy;
    using mapping_type     = typename layout_type::template mapping<extents_type>;
    using element_type     = ElementType;
    using value_type       = remove_cv_t<element_type>;
    using index_type       = typename extents_type::index_type;
    using size_type        = typename extents_type::size_type;
    using rank_type        = typename extents_type::rank_type;
    using data_handle_type = typename accessor_type::data_handle_type;
    using reference        = typename accessor_type::référence;
    static constexpr rank_type rank() noexcept { return extents_type::rang(); }
    static constexpr rank_type rank_dynamic() noexcept
    {
      return extents_type::rank_dynamic();
    }
    static constexpr size_t static_extent(rank_type r) noexcept
    {
      return extents_type::static_extent(r);
    }
    constexpr index_type extent(rank_type r) const noexcept
    {
      return extents().extent(r);
    }
    // constructeurs
    constexpr mdspan();
    constexpr mdspan(const mdspan& rhs) = default;
    constexpr mdspan(mdspan&& rhs)      = default;
    template<class... OtherIndexTypes>
    constexpr explicit mdspan(data_handle_type ptr, OtherIndexTypes... exts);
    template<class OtherIndexType, size_t N>
    constexpr explicit(N != rank_dynamic())
      mdspan(data_handle_type p, span<OtherIndexType, N> exts);
    template<class OtherIndexType, size_t N>
    constexpr explicit(N != rank_dynamic())
      mdspan(data_handle_type p, const array<OtherIndexType, N>& exts);
    constexpr mdspan(data_handle_type p, const extents_type& ext);
    constexpr mdspan(data_handle_type p, const mapping_type& m);
    constexpr mdspan(data_handle_type p, const mapping_type& m, const accessor_type& a);
    template<class OtherElementType,
             class OtherExtents,
             class OtherLayoutPolicy,
             class OtherAccessorPolicy>
    constexpr explicit(/* voir description */)
      mdspan(const mdspan<OtherElementType,
                          OtherExtents,
                          OtherLayoutPolicy,
                          OtherAccessorPolicy>& other);
    constexpr mdspan& operator=(const mdspan& rhs) = default;
    constexpr mdspan& operator=(mdspan&& rhs)      = default;
    // membres
    template<class... OtherIndexTypes>
    constexpr reference operator[](OtherIndexTypes... indices) const;
    template<class OtherIndexType>
    constexpr reference operator[](span<OtherIndexType, rank()> indices) const;
    template<class OtherIndexType>
    constexpr reference operator[](const array<OtherIndexType, rank()>& indices) const;
    constexpr size_type size() const noexcept;
    constexpr bool empty() const noexcept;
    friend constexpr void swap(mdspan& x, mdspan& y) noexcept;
    constexpr const extents_type& extents() const noexcept { return /*map_*/.extents(); }
    constexpr const data_handle_type& data_handle() const noexcept { return /*ptr_*/; }
    constexpr const mapping_type& mapping() const noexcept { return /*map_*/; }
    constexpr const accessor_type& accessor() const noexcept { return /*acc_*/; }
    static constexpr bool is_always_unique() { return mapping_type::is_always_unique(); }
    static constexpr bool is_always_exhaustive()
    {
      return mapping_type::is_always_exhaustive();
    }
    static constexpr bool is_always_strided()
    {
      return mapping_type::is_always_strided();
    }
    constexpr bool is_unique() const { return /*map_*/.is_unique(); }
    constexpr bool is_exhaustive() const { return /*map_*/.is_exhaustive(); }
    constexpr bool is_strided() const { return /*map_*/.is_strided(); }
    constexpr index_type stride(rank_type r) const { return /*map_*/.stride(r); }
  private:
    accessor_type /*acc_*/;    // exposition uniquement
    mapping_type /*map_*/;     // exposition uniquement
    data_handle_type /*ptr_*/; // exposition uniquement
  };
  template<class CArray>
    requires(is_array_v<CArray> && rank_v<CArray> == 1)
  mdspan(CArray&)
    -> mdspan<remove_all_extents_t<CArray>, extents<size_t, extent_v<CArray, 0>>>;
  template<class Pointer>
    requires(is_pointer_v<remove_reference_t<Pointer>>)
  mdspan(Pointer&&)
    -> mdspan<remove_pointer_t<remove_reference_t<Pointer>>, extents<size_t>>;
  template<class ElementType, class... Intégrales>
    requires((is_convertible_v<Integrals, size_t> && ...) && sizeof...(Integrals) > 0)
  explicit mdspan(ElementType*, Integrals...)
    -> mdspan<ElementType, extents<size_t, /*maybe-static-ext*/<Integrals>...>>;
  template<class ElementType, class OtherIndexType, size_t N>
  mdspan(ElementType*, span<OtherIndexType, N>)
    -> mdspan<ElementType, dextents<size_t, N>>;
  template<class ElementType, class OtherIndexType, size_t N>
  mdspan(ElementType*, const array<OtherIndexType, N>&)
    -> mdspan<ElementType, dextents<size_t, N>>;
  template<class ElementType, class IndexType, size_t... ExtentsPack>
  mdspan(ElementType*, const extents<IndexType, ExtentsPack...>&)
    -> mdspan<ElementType, extents<IndexType, ExtentsPack...>>;
  template<class ElementType, class MappingType>
  mdspan(ElementType*, const MappingType&) -> mdspan<ElementType,
                                                     typename MappingType::extents_type,
                                                     typename MappingType::layout_type>;
  template<class MappingType, class AccessorType>
  mdspan(const typename AccessorType::data_handle_type&,
         const MappingType&,
         const AccessorType&) -> mdspan<typename AccessorType::element_type,
                                        typename MappingType::extents_type,
                                        typename MappingType::layout_type,
                                        AccessorType>;
}

Modèle de classe std::extents

namespace std {
  template<class IndexType, size_t... Extents>
  class extents
  {
  public:
    using index_type = IndexType;
    using size_type  = make_unsigned_t<index_type>;
    using rank_type  = size_t;
    // observateurs de l'espace d'index multidimensionnel
    static constexpr rank_type rank() noexcept { return sizeof...(Extents); }
    static constexpr rank_type rank_dynamic() noexcept
    {
      return /*dynamic-index*/(rank());
    }
    static constexpr size_t static_extent(rank_type) noexcept;
    constexpr index_type extent(rank_type) const noexcept;
    // constructeurs
    constexpr extents() noexcept = default;
    template<class OtherIndexType, size_t... OtherExtents>
    constexpr explicit(/* voir description */)
      extents(const extents<OtherIndexType, OtherExtents...>&) noexcept;
    template<class... OtherIndexTypes>
    constexpr explicit extents(OtherIndexTypes...) noexcept;
    template<class OtherIndexType, size_t N>
    constexpr explicit(N != rank_dynamic()) extents(span<OtherIndexType, N>) noexcept;
    template<class OtherIndexType, size_t N>
    constexpr explicit(N != rank_dynamic())
      extents(const array<OtherIndexType, N>&) noexcept;
    // opérateurs de comparaison
    template<class OtherIndexType, size_t... OtherExtents>
    friend constexpr bool operator==(
      const extents&,
      const extents<OtherIndexType, OtherExtents...>&) noexcept;
    // aides d'exposition uniquement
    constexpr size_t /*fwd-prod-of-extents*/(rank_type) const noexcept; // exposition uniquement
    constexpr size_t /*rev-prod-of-extents*/(rank_type) const noexcept; // exposition uniquement
    template<class OtherIndexType>
    static constexpr auto /*index-cast*/(OtherIndexType&&) noexcept; // exposition uniquement
  private:
    static constexpr rank_type /*dynamic-index*/(rank_type) noexcept; // exposition uniquement
    static constexpr rank_type /*dynamic-index-inv*/(
      rank_type) noexcept;                                   // exposition uniquement
    array<index_type, rank_dynamic()> /*dynamic-extents*/{}; // exposition uniquement
  };
  template<class... Integrals>
  explicit extents(Integrals...)->/* voir description */;
}

Politiques de mappage de disposition

namespace std {
  struct layout_left
  {
    template<class Extents>
    class mapping;
  };
  struct layout_right
  {
    template<class Extents>
    class mapping;
  };
  struct layout_stride
  {
    template<class Extents>
    class mapping;
  };
  template<size_t PaddingValue>
  struct layout_left_padded
  {
    template<class Extents>
    class mapping;
  };
  template<size_t PaddingValue>
  struct layout_right_padded
  {
    template<class Extents>
    class mapping;
  };
}
**Note:** Le code C++ n'a pas été traduit car il se trouve dans des balises `
` et contient des termes spécifiques au C++ qui doivent être préservés selon les instructions. La structure HTML et le formatage original ont été maintenus intacts.

Modèle de classe std::layout_left::mapping

namespace std {
  template<class Extents>
  class layout_left::mapping
  {
  public:
    using extents_type = Extents;
    using index_type   = typename extents_type::index_type;
    using size_type    = typename extents_type::size_type;
    using rank_type    = typename extents_type::rank_type;
    using layout_type  = layout_left;
    // constructeurs
    constexpr mapping() noexcept               = default;
    constexpr mapping(const mapping&) noexcept = default;
    constexpr mapping(const extents_type&) noexcept;
    template<class OtherExtents>
    constexpr explicit(!is_convertible_v<OtherExtents, extents_type>)
      mapping(const mapping<OtherExtents>&) noexcept;
    template<class OtherExtents>
    constexpr explicit(!is_convertible_v<OtherExtents, extents_type>)
      mapping(const layout_right::mapping<OtherExtents>&) noexcept;
    template<class LayoutLeftPaddedMapping>
    constexpr explicit(
      !is_convertible_v<typename LayoutLeftPaddedMapping::extents_type, extents_type>)
      mapping(const LayoutLeftPaddedMapping&) noexcept;
    template<class OtherExtents>
    constexpr explicit(extents_type::rank() > 0)
      mapping(const layout_stride::mapping<OtherExtents>&);
    constexpr mapping& operator=(const mapping&) noexcept = default;
    // observateurs
    constexpr const extents_type& extents() const noexcept { return /*extents_*/; }
    constexpr index_type required_span_size() const noexcept;
    template<class... Indices>
    constexpr index_type operator()(Indices...) const noexcept;
    static constexpr bool is_always_unique() noexcept { return true; }
    static constexpr bool is_always_exhaustive() noexcept { return true; }
    static constexpr bool is_always_strided() noexcept { return true; }
    static constexpr bool is_unique() noexcept { return true; }
    static constexpr bool is_exhaustive() noexcept { return true; }
    static constexpr bool is_strided() noexcept { return true; }
    constexpr index_type stride(rank_type) const noexcept;
    template<class OtherExtents>
    friend constexpr bool operator==(const mapping&,
                                     const mapping<OtherExtents>&) noexcept;
  private:
    extents_type /*extents_*/{}; // exposition uniquement
    // spécialisation de mapping pour submdspan
    template<class... SliceSpecifiers>
    constexpr auto /*submdspan-mapping-impl*/(SliceSpecifiers...) const // exposition uniquement
      -> /* voir description */;
    template<class... SliceSpecifiers>
    friend constexpr auto submdspan_mapping(const mapping& src, SliceSpecifiers... slices)
    {
      return src./*submdspan-mapping-impl*/(slices...);
    }
  };
}

Modèle de classe std::layout_right::mapping

namespace std {
  template<class Extents>
  class layout_right::mapping
  {
  public:
    using extents_type = Extents;
    using index_type   = typename extents_type::index_type;
    using size_type    = typename extents_type::size_type;
    using rank_type    = typename extents_type::rank_type;
    using layout_type  = layout_right;
    // constructeurs
    constexpr mapping() noexcept               = default;
    constexpr mapping(const mapping&) noexcept = default;
    constexpr mapping(const extents_type&) noexcept;
    template<class OtherExtents>
    constexpr explicit(!is_convertible_v<OtherExtents, extents_type>)
      mapping(const mapping<OtherExtents>&) noexcept;
    template<class OtherExtents>
    constexpr explicit(!is_convertible_v<OtherExtents, extents_type>)
      mapping(const layout_left::mapping<OtherExtents>&) noexcept;
    template<class LayoutRightPaddedMapping>
    constexpr explicit(
      !is_convertible_v<typename LayoutRightPaddedMapping::extents_type, extents_type>)
      mapping(const LayoutRightPaddedMapping&) noexcept;
    template<class OtherExtents>
    constexpr explicit(extents_type::rang() > 0)
      mapping(const layout_stride::mapping<OtherExtents>&) noexcept;
    constexpr mapping& operator=(const mapping&) noexcept = default;
    // observateurs
    constexpr const extents_type& extents() const noexcept { return /*extents_*/; }
    constexpr index_type required_span_size() const noexcept;
    template<class... Indices>
    constexpr index_type operator()(Indices...) const noexcept;
    static constexpr bool is_always_unique() noexcept { return true; }
    static constexpr bool is_always_exhaustive() noexcept { return true; }
    static constexpr bool is_always_strided() noexcept { return true; }
    static constexpr bool is_unique() noexcept { return true; }
    static constexpr bool is_exhaustive() noexcept { return true; }
    static constexpr bool is_strided() noexcept { return true; }
    constexpr index_type stride(rank_type) const noexcept;
    template<class OtherExtents>
    friend constexpr bool operator==(const mapping&,
                                     const mapping<OtherExtents>&) noexcept;
  private:
    extents_type /*extents_*/{}; // exposition uniquement
    // spécialisation de mappage submdspan
    template<class... SliceSpecifiers>
    constexpr auto /*submdspan-mapping-impl*/(SliceSpecifiers...) const // exposition uniquement
      -> /* voir description */;
    template<class... SliceSpecifiers>
    friend constexpr auto submdspan_mapping(const mapping& src, SliceSpecifiers... slices)
    {
      return src./*submdspan-mapping-impl*/(slices...);
    }
  };
}

Modèle de classe std::layout_stride::mapping

namespace std {
  template<class Extents>
  class layout_stride::mapping
  {
  public:
    using extents_type = Extents;
    using index_type   = typename extents_type::index_type;
    using size_type    = typename extents_type::size_type;
    using rank_type    = typename extents_type::rank_type;
    using layout_type  = layout_stride;
  private:
    static constexpr rank_type /*rank_*/ = extents_type::rank(); // exposition uniquenent
  public:
    // constructeurs
    constexpr mapping() noexcept;
    constexpr mapping(const mapping&) noexcept = default;
    template<class OtherIndexType>
    constexpr mapping(const extents_type&, span<OtherIndexType, /*rank_*/>) noexcept;
    template<class OtherIndexType>
    constexpr mapping(const extents_type&,
                      const array<OtherIndexType, /*rank_*/>&) noexcept;
    template<class StridedLayoutMapping>
    constexpr explicit(/* voir description */)
      mapping(const StridedLayoutMapping&) noexcept;
    constexpr mapping& operator=(const mapping&) noexcept = default;
    // observateurs
    constexpr const extents_type& extents() const noexcept { return /*extents_*/; }
    constexpr array<index_type, /*rank_*/> strides() const noexcept
    {
      return /*strides_*/;
    }
    constexpr index_type required_span_size() const noexcept;
    template<class... Indices>
    constexpr index_type operator()(Indices...) const noexcept;
    static constexpr bool is_always_unique() noexcept { return true; }
    static constexpr bool is_always_exhaustive() noexcept { return false; }
    static constexpr bool is_always_strided() noexcept { return true; }
    static constexpr bool is_unique() noexcept { return true; }
    constexpr bool is_exhaustive() const noexcept;
    static constexpr bool is_strided() noexcept { return true; }
    constexpr index_type stride(rank_type i) const noexcept { return /*strides_*/[i]; }
    template<class OtherMapping>
    friend constexpr bool operator==(const mapping&, const OtherMapping&) noexcept;
  private:
    extents_type /*extents_*/{};                 // exposition uniquenent
    array<index_type, /*rank_*/> /*strides_*/{}; // exposition uniquenent
    // spécialisation de mapping submdspan
    template<class... SliceSpecifiers>
    constexpr auto /*submdspan-mapping-impl*/(SliceSpecifiers...) const // exposition uniquenent
      -> /* voir description */;
    template<class... SliceSpecifiers>
    friend constexpr auto submdspan_mapping(const mapping& src, SliceSpecifiers... slices)
    {
      return src./*submdspan-mapping-impl*/(slices...);
    }
  };
}

Modèle de classe std::layout_left_padded::mapping

namespace std {
  template<size_t PaddingValue>
  template<class Extents>
  class layout_left_padded<PaddingValue>::mapping
  {
  public:
    static constexpr size_t padding_value = PaddingValue;
    using extents_type                    = Extents;
    using index_type                      = typename extents_type::index_type;
    using size_type                       = typename extents_type::size_type;
    using rank_type                       = typename extents_type::rank_type;
    using layout_type                     = layout_left_padded<PaddingValue>;
  private:
    static constexpr size_t /*rank_*/ = extents_type::rang(); // exposition uniquement
    static constexpr size_t /*premier-static-extent*/ =         // exposition uniquement
      extents_type::static_extent(0);
    // membres d'exposition uniquement
    static constexpr size_t /*rembourrage-statique-pas*/ =
      /* voir description */; // exposition uniquement
  public:
    // constructeurs
    constexpr mapping() noexcept
      : mapping(extents_type{})
    {
    }
    constexpr mapping(const mapping&) noexcept = default;
    constexpr mapping(const extents_type&);
    template<class OtherIndexType>
    constexpr mapping(const extents_type&, OtherIndexType);
    template<class OtherExtents>
    constexpr explicit(!is_convertible_v<OtherExtents, extents_type>)
      mapping(const layout_left::mapping<OtherExtents>&);
    template<class OtherExtents>
    constexpr explicit(extents_type::rang() > 0)
      mapping(const layout_stride::mapping<OtherExtents>&);
    template<class LayoutLeftPaddedMapping>
    constexpr explicit(/* voir description */) mapping(const LayoutLeftPaddedMapping&);
    template<class LayoutRightPaddedMapping>
    constexpr explicit(/* voir description */)
      mapping(const LayoutRightPaddedMapping&) noexcept;
    constexpr mapping& operator=(const mapping&) noexcept = default;
    // observateurs
    constexpr const extents_type& extents() const noexcept { return /*extents_*/; }
    constexpr array<index_type, rank_> strides() const noexcept;
    constexpr index_type required_span_size() const noexcept;
    template<class... Indices>
    constexpr index_type operator()(Indices...) const noexcept;
    static constexpr bool is_always_unique() noexcept { return true; }
    static constexpr bool is_always_exhaustive() noexcept;
    static constexpr bool is_always_strided() noexcept { return true; }
    static constexpr bool is_unique() noexcept { return true; }
    constexpr bool is_exhaustive() const noexcept;
    static constexpr bool is_strided() noexcept { return true; }
    constexpr index_type stride(rank_type) const noexcept;
    template<class LayoutLeftPaddedMapping>
    friend constexpr bool operator==(const mapping&,
                                     const LayoutLeftPaddedMapping&) noexcept;
  private:
    // membres d'exposition uniquement
    index_type /*stride-1*/ = /*rembourrage-statique-pas*/; // exposition uniquement
    extents_type /*extents_*/{};                         // exposition uniquement
    // spécialisation de mappage submdspan
    template<class... SliceSpecifiers>
    constexpr auto /*submdspan-mapping-impl*/(SliceSpecifiers...) const // exposition uniquement
      -> /* voir description */;
    template<class... SliceSpecifiers>
    friend constexpr auto submdspan_mapping(const mapping& src, SliceSpecifiers... slices)
    {
      return src./*submdspan-mapping-impl*/(slices...);
    }
  };
}

Modèle de classe std::layout_right_padded::mapping

namespace std {
  template<size_t PaddingValue>
  template<class Extents>
  class layout_right_padded<PaddingValue>::mapping
  {
  public:
    static constexpr size_t padding_value = PaddingValue;
    using extents_type                    = Extents;
    using index_type                      = typename extents_type::index_type;
    using size_type                       = typename extents_type::size_type;
    using rank_type                       = typename extents_type::rank_type;
    using layout_type                     = layout_right_padded<PaddingValue>;
  private:
    static constexpr size_t /*rank_*/ = extents_type::rang(); // exposition uniquement
    static constexpr size_t /*last-static-extent*/ =          // exposition uniquement
      extents_type::static_extent(/*rank_*/ - 1);
    // membres d'exposition uniquement
    static constexpr size_t /*rembourrage-statique-pas*/ =
      /* voir description */; // exposition uniquement
  public:
    // constructeurs
    constexpr mapping() noexcept
      : mapping(extents_type{})
    {
    }
    constexpr mapping(const mapping&) noexcept = default;
    constexpr mapping(const extents_type&);
    template<class OtherIndexType>
    constexpr mapping(const extents_type&, OtherIndexType);
    template<class OtherExtents>
    constexpr explicit(!is_convertible_v<OtherExtents, extents_type>)
      mapping(const layout_right::mapping<OtherExtents>&);
    template<class OtherExtents>
    constexpr explicit(rank_ > 0) mapping(const layout_stride::mapping<OtherExtents>&);
    template<class LayoutRightPaddedMapping>
    constexpr explicit(/* voir description */) mapping(const LayoutRightPaddedMapping&);
    template<class LayoutLeftPaddedMapping>
    constexpr explicit(/* voir description */)
      mapping(const LayoutLeftPaddedMapping&) noexcept;
    constexpr mapping& operator=(const mapping&) noexcept = default;
    // observateurs
    constexpr const extents_type& extents() const noexcept { return extents_; }
    constexpr array<index_type, rank_> strides() const noexcept;
    constexpr index_type required_span_size() const noexcept;
    template<class... Indices>
    constexpr index_type operator()(Indices...) const noexcept;
    static constexpr bool is_always_unique() noexcept { return true; }
    static constexpr bool is_always_exhaustive() noexcept;
    static constexpr bool is_always_strided() noexcept { return true; }
    static constexpr bool is_unique() noexcept { return true; }
    constexpr bool is_exhaustive() const noexcept;
    static constexpr bool is_strided() noexcept { return true; }
    constexpr index_type stride(rank_type) const noexcept;
    template<class LayoutRightPaddedMapping>
    friend constexpr bool operator==(const mapping&,
                                     const LayoutRightPaddedMapping&) noexcept;
  private:
    // membres d'exposition uniquement
    index_type /*stride-rm2*/ = /*static-padding-stride*/; // exposition uniquement
    extents_type /*extents_*/{};                           // exposition uniquement
    // spécialisation de mappage submdspan
    template<class... SliceSpecifiers>
    constexpr auto /*submdspan-mapping-impl*/(SliceSpecifiers...) const // exposition uniquement
      -> /* voir description */;
    template<class... SliceSpecifiers>
    friend constexpr auto submdspan_mapping(const mapping& src, SliceSpecifiers... slices)
    {
      return src./*submdspan-mapping-impl*/(slices...);
    }
  };
}

Aides d'exposition uniquement

template<class T>
constexpr bool /*is-extents*/ = false; // à titre d'illustration uniquement
template<class IndexType, size_t... Args>
constexpr bool /*is-extents*/<extents<IndexType, Args...>> = true; // à titre d'illustration uniquement
template<class M>
concept /*layout-mapping-alike*/ = requires { // à titre d'illustration uniquement
  requires /*is-extents*/<typename M::extents_type>;
  {
    M::is_always_strided()
  } -> same_as<bool>;
  {
    M::is_always_exhaustive()
  } -> same_as<bool>;
  {
    M::is_always_unique()
  } -> same_as<bool>;
  bool_constant<M::is_always_strided()>::value;
  bool_constant<M::is_always_exhaustive()>::value;
  bool_constant<M::is_always_unique()>::value;
};
template<class T>
constexpr T
/*de-ice*/(T val)
{
  return val;
}
template</*integral-constant-like*/ T>
constexpr auto
/*de-ice*/(T)
{
  return T::value;
}
template<class IndexType, size_t k, class... SliceSpecifiers>
constexpr IndexType
/*first_*/(SliceSpecifiers... slices);
template<size_t k, class Extents, class... SliceSpecifiers>
constexpr auto
/*last_*/(const Extents& src, SliceSpecifiers... slices);
template<class IndexType, size_t N, class... SliceSpecifiers>
constexpr array<IndexType, sizeof...(SliceSpecifiers)>
/*src-indices*/(const array<IndexType, N>& indices, SliceSpecifiers... slices);

Modèle de classe std::default_accessor

namespace std {
  template<class ElementType>
  struct default_accessor
  {
    using offset_policy                   = default_accessor;
    using element_type                    = ElementType;
    using reference                       = ElementType&;
    using data_handle_type                = ElementType*;
    constexpr default_accessor() noexcept = default;
    template<class OtherElementType>
    constexpr default_accessor(default_accessor<OtherElementType>) noexcept;
    constexpr reference access(data_handle_type p, size_t i) const noexcept;
    constexpr data_handle_type offset(data_handle_type p, size_t i) const noexcept;
  };
}
**Note:** Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises `
` et contient des termes spécifiques au C++ qui doivent être préservés. Seul le texte environnant aurait été traduit s'il y en avait eu.

Modèle de classe std::strided_slice

namespace std {
  template<class OffsetType, class ExtentType, class StrideType>
  struct strided_slice
  {
    using offset_type = OffsetType;
    using extent_type = ExtentType;
    using stride_type = StrideType;
    [[no_unique_address]] offset_type offset{};
    [[no_unique_address]] extent_type extent{};
    [[no_unique_address]] stride_type stride{};
  };
}

Modèle de classe std::submdspan_mapping_result

namespace std {
  template<class LayoutMapping>
  struct submdspan_mapping_result
  {
    [[no_unique_address]] LayoutMapping mapping = LayoutMapping();
    size_t offset{};
  };
}

Références

  • Norme C++23 (ISO/CEI 14882:2024) :
  • 24.7.4 Synopsis de l'en-tête <mdspan> [mdspan.syn]