Namespaces
Variants

std::define_static_array

De fr.cppreference.net
< cpp | meta
 
 
 
Bibliothèque de réflexion
 
Types et requêtes de réflexion
Requêtes de réflexion
Requêtes de disposition de réflexion
Propriétés de type
Requêtes de propriété de type
 
Défini dans l'en-tête <meta>
template< ranges::input_range R >
consteval std::span<const ranges::range_value_t<R>> define_static_array( R&& r );
(depuis C++26)

Promeut un tableau vers le stockage statique.

Soit N égal à static_cast<std::size_t>(ranges::size(r)) si ranges::size(r) est une expression constante, ou à std::dynamic_extent sinon. L'effet est équivalent à :

using T = ranges::range_value_t<R>;
std::meta::info array = std::meta::reflect_constant_array(r);
if (std::meta::is_array_type(std::meta::type_of(array)))
    return std::span<const T, N>(std::meta::extract<const T*>(array),
                                 std::meta::extent(std::meta::type_of(array)));
else
    return std::span<const T, N>(static_cast<const T*>(nullptr), 0);

Paramètres

r - une input_range dont les éléments sont constructibles par copie et ont un type structurel

Valeur de retour

Si la taille de r n'est pas nulle, un span construit à partir d'un tableau de type const T[N] (où T est ranges::range_value_t<R> et N est la taille de r). Chaque élément du tableau est initialisé à partir de la valeur ou de l'objet représenté par std::meta::reflect_constant(static_cast<T>(*it)), où it est un itérateur vers l'élément correspondant de r.

Sinon (la taille de r est nulle), un span vide.

Notes

En tant qu'objet paramètre de modèle, l'objet tableau résultant (s'il existe) a une durée de stockage statique. Les plages dont le contenu est équivalent aux arguments de modèle correspondent au même objet tableau.

L'objet tableau est un objet potentiellement non unique.

Test de fonctionnalité macro Valeur Std Fonctionnalité
__cpp_lib_define_static 202506L (C++26) std::define_static_array

Exemple

#include <algorithm>
#include <meta>
#include <print>
#include <vector>

constexpr std::vector<double> precompute_angles(std::size_t size)
{
    std::vector<double> angles(size);
    for (int i{}; double& angle : angles)
        angle = 360.0 / size * i++;
    
    return angles;
}

consteval std::span<const double> precompute_angles_arr(std::size_t size)
{
    std::vector<double> angles = precompute_angles(size);
    return std::define_static_array(angles);
}

int main()
{
    // std::vector<double> angles = precompute_angles(7);
    //     error: call to consteval function ‘precompute_angles(7)’ is not a constant
    //            expression because it refers to a result of ‘operator new’

    std::span<const double> angles = precompute_angles_arr(7);
    for (double angle : angles)
        std::print("{:.1f} ", angle);

    std::println();
}

Sortie :

0.0 51.4 102.9 154.3 205.7 257.1 308.6

Voir aussi

promeut une chaîne de compilation en stockage statique, retournant un pointeur vers le premier caractère de la chaîne statique
(modèle de fonction)
promeut une valeur de compilation en stockage statique, retournant un pointeur vers l'objet statique
(modèle de fonction)
promeut un tableau de compilation en stockage statique, retournant une réflexion représentant le tableau statique
(modèle de fonction)