>백엔드 개발 >C++ >C의 정적 배열을 컴파일 타임에 프로그래밍 방식으로 초기화할 수 있습니까?

C의 정적 배열을 컴파일 타임에 프로그래밍 방식으로 초기화할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-19 21:09:02637검색

Can Static Arrays in C   Be Programmatically Initialized at Compile Time?

C에서 컴파일 시 프로그래밍 방식으로 정적 배열 생성

C에서 컴파일 시 정적 배열을 생성하는 것은 성능과 데이터 무결성을 보장합니다. 정적 배열을 정의하는 한 가지 방법은 다음 구문을 사용하는 것입니다.

const std::size_t size = 5;
unsigned int list[size] = { 1, 2, 3, 4, 5 };

이 접근 방식은 간단하지만 배열 값을 명시적으로 지정해야 합니다. 더 많은 유연성을 얻으려면 다양한 메타프로그래밍 기술을 사용하여 컴파일 타임에 이러한 값을 "프로그래밍 방식으로" 할당하는 것이 바람직할 수 있습니다.

질문 1: 프로그래밍 방식으로 값 할당

할 수 있나요? 컴파일 타임에 "프로그래밍 방식으로" 배열 값을 할당하기 위해 메타프로그래밍 기술을 사용하시겠습니까?

답변:

예, C 0x 기능을 사용하면 템플릿의 로컬 또는 멤버 배열을 초기화할 수 있습니다. 가변 템플릿 인수 목록에서. 이 접근 방식은 템플릿 인스턴스화 깊이에 의해 제한될 수 있지만 유연성이 크게 향상될 수 있습니다.

질문 2: 선택적 값 할당

배열은 몇 가지를 제외하면 동일합니다. 프로그래밍 방식으로 컴파일 타임에 선택적으로 값을 할당할 수 있습니까?

답변:

예, 조합을 사용할 수 있습니다. 특정 값을 가진 배열을 생성하기 위한 가변 템플릿 및 함수 템플릿. 예를 들어 다음 코드를 생각해 보세요.

template<unsigned... args> struct ArrayHolder {
    static const unsigned data[sizeof...(args)];
};

template<unsigned... args> 
const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };

template<size_t N, template<size_t> class F, unsigned... args> 
struct generate_array_impl {
    typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;
};

template<template<size_t> class F, unsigned... args> 
struct generate_array_impl<0, F, args...> {
    typedef ArrayHolder<F<0>::value, args...> result;
};

template<size_t N, template<size_t> class F> 
struct generate_array {
    typedef typename generate_array_impl<N-1, F>::result result;
};

이 코드를 사용하면 각 인덱스의 값을 결정하는 템플릿 함수를 지정하여 특정 값이 포함된 배열을 만들 수 있습니다.

예 :

1부터 5까지의 값을 갖는 크기 5의 배열을 생성하려면:

template<size_t index> struct MetaFunc { 
    enum { value = index + 1 }; 
};

void test() {
    const size_t count = 5;
    typedef generate_array<count, MetaFunc>::result A;

    for (size_t i=0; i<count; ++i) 
        std::cout << A::data[i] << "\n";
}

위 내용은 C의 정적 배열을 컴파일 타임에 프로그래밍 방식으로 초기화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.