> 백엔드 개발 > C++ > 컴파일 시간 정적 배열을 동적으로 생성하는 데 C 메타프로그래밍을 사용할 수 있습니까?

컴파일 시간 정적 배열을 동적으로 생성하는 데 C 메타프로그래밍을 사용할 수 있습니까?

Patricia Arquette
풀어 주다: 2024-12-04 14:05:11
원래의
774명이 탐색했습니다.

Can C   Metaprogramming Be Used for Dynamically Creating Compile-Time Static Arrays?

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

문제 소개

전통적으로 C에서 정적 배열은 고정 배열을 사용하여 컴파일 타임에 정의할 수 있습니다. 크기 배열. 그러나 특정 시나리오의 경우 컴파일 타임에 프로그래밍 방식으로 값을 할당하는 것이 바람직할 수 있습니다. 이 기사에서는 정적 배열을 동적으로 생성하는 메타프로그래밍 기술을 살펴봅니다.

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

C 0x 기능을 사용하면 템플릿의 로컬 또는 멤버 배열을 초기화할 수 있습니다. 가변 템플릿 인수 목록. 이 해결 방법은 최대 템플릿 인스턴스화 깊이로 인해 제한이 있습니다.

질문 2: 선택적 값 할당

컴파일 시 선택적으로 값을 할당하려면 가변 템플릿과 메타 함수의 조합을 사용할 수 있습니다. MetaFunc 템플릿은 해당 인덱스를 기반으로 일련의 값을 생성하는 매개변수 팩 역할을 합니다. 그런 다음 generate_array 템플릿은 생성된 값을 사용하여 원하는 크기의 배열을 생성할 수 있습니다.

구현 예

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

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

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<unsigned... args> struct ArrayHolder {
    static const unsigned data[sizeof...(args)];
};

template<unsigned... args> 
const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };
로그인 후 복사

사용 예

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";
}
로그인 후 복사

이 예는 정적 배열을 정의합니다. MetaFunc를 사용하여 컴파일 타임에 할당된 값 {1, 2, 3, 4, 5}를 포함하는 크기 5의 배열 메타함수.

위 내용은 컴파일 시간 정적 배열을 동적으로 생성하는 데 C 메타프로그래밍을 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿