Namespaces
Variants

std::define_static_array

От ru.cppreference.net
< cpp | meta
 
 
 
Библиотека отражения
Запросы доступности членов
Идентификация области видимости
Запросы членов отражения
Отражение аннотаций
Извлечение значений
Подстановка отражения
Отражение результатов выражений
Генерация определений классов

Основные категории типов
Составные категории типов
Свойства типов ➜
Отношения типов
 
Типы отражения и запросы
Запросы отражения
Запросы компоновки отражения
Свойства типов
Запросы свойств типов
 
Определено в заголовке <meta>
template< ranges::input_range R >
consteval std::span<const ranges::range_value_t<R>> define_static_array( R&& r );
(начиная с C++26)

Переводит массив в статическое хранилище.

Пусть N будет static_cast<std::size_t>(ranges::size(r)), если ranges::size(r) является константным выражением, или std::dynamic_extent в противном случае. Эффект эквивалентен:

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);

Параметры

r - input_range, элементы которого копируемы и имеют структурный тип

Возвращаемое значение

Если размер r не равен нулю, span, созданный из массива типа const T[N] (где T — это ranges::range_value_t<R>, а N — размер r). Каждый элемент массива инициализируется из значения или объекта, представленного std::meta::reflect_constant(static_cast<T>(*it)), где it — итератор на соответствующий элемент r.

В противном случае (размер r равен нулю), пустой span.

Примечания

В качестве объекта параметра шаблона, результирующий объект массива (если присутствует) имеет статическую продолжительность хранения. Диапазоны с эквивалентностью аргументов шаблона соответствуют одному и тому же объекту массива.

Объект массива является потенциально неуникальным объектом.

Макрос проверки возможности Значение Стандарт Возможность
__cpp_lib_define_static 202506L (C++26) std::define_static_array

Пример

#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();
}

Вывод:

0.0 51.4 102.9 154.3 205.7 257.1 308.6

Смотри также

переводит строку времени компиляции в статическое хранилище, возвращая указатель на первый символ статической строки
(шаблон функции)
переводит значение времени компиляции в статическое хранилище, возвращая указатель на статический объект
(шаблон функции)
переводит массив времени компиляции в статическое хранилище, возвращая отражение, представляющее статический массив
(шаблон функции)