Namespaces
Variants

std::define_static_array

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의 크기가 0이 아닌 경우, const T[N] 타입의 배열(여기서 T는 ranges::range_value_t<R>이고 N는 r의 크기)로부터 생성된 span입니다. 배열의 각 요소는 std::meta::reflect_constant(static_cast<T>(*it))이 나타내는 값 또는 객체로 초기화되며, 여기서 it은 r의 해당 요소를 가리키는 반복자입니다.

그렇지 않은 경우(r의 크기가 0인 경우), 빈 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

같이 보기

컴파일 타임 문자열을 정적 저장소로 승격하여 정적 문자열의 첫 번째 문자에 대한 포인터를 반환합니다
(함수 템플릿)
컴파일 타임 값을 정적 저장소로 승격하여 정적 객체에 대한 포인터를 반환합니다
(함수 템플릿)
컴파일 타임 배열을 정적 저장소로 승격하여 정적 배열을 나타내는 리플렉션을 반환합니다
(함수 템플릿)