std::define_static_array
| Определено в заголовке <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
Смотри также
(C++26) |
переводит строку времени компиляции в статическое хранилище, возвращая указатель на первый символ статической строки (шаблон функции) |
(C++26) |
переводит значение времени компиляции в статическое хранилище, возвращая указатель на статический объект (шаблон функции) |
(C++26) |
переводит массив времени компиляции в статическое хранилище, возвращая отражение, представляющее статический массив (шаблон функции) |