컴파일 타임 메타 프로그래밍의 뉘앙스 공개
성찰의 영역에서 다음 사항이 필요합니다. 고유 식별자를 동적으로 할당하거나 컴파일 타임에 유형에 대해 유사한 작업을 실행합니다. 템플릿 메타프로그래밍은 본질적으로 함수형 언어이지만 이러한 작업을 구현하는 데 필요한 전역 변수와 수정 가능한 상태가 부족한 것으로 보입니다.
놀랍게도 이 딜레마에 대한 답은 함수 조회와 네임스페이스 범위 기능의 교차점에 있습니다. . 함수 조회는 정의된 선언된 함수 집합에서 숫자 상태를 추출하는 방법을 제공합니다.
다음 예에서는 이 기술을 적용하여 컴파일 시간 계산을 달성하는 방법을 보여줍니다.
template< size_t n > // This type returns a number through function lookup. struct cn // The function returns cn<n>. { char data[ n + 1 ]; }; // The caller uses (sizeof fn() - 1). template< typename id, size_t n, size_t acc > cn< acc > seen( id, cn< n >, cn< acc > ); // Default fallback case. /* Evaluate the counter by finding the last defined overload. Each function, when defined, alters the lookup sequence for lower-order functions. */ #define counter_read( id ) \ ( sizeof seen( id(), cn< 1 >(), cn< \ ( sizeof seen( id(), cn< 2 >(), cn< \ ( sizeof seen( id(), cn< 4 >(), cn< \ ( sizeof seen( id(), cn< 8 >(), cn< \ ( sizeof seen( id(), cn< 16 >(), cn< \ ( sizeof seen( id(), cn< 32 >(), cn< 0 \ /* Add more as desired; trimmed for Stack Overflow code block. */ \ >() ).data - 1 ) \ >() ).data - 1 ) \ >() ).data - 1 ) \ >() ).data - 1 ) \ >() ).data - 1 ) \ >() ).data - 1 )
#define counter_inc( id ) \ cn< counter_read( id ) + 1 > \ seen( id, cn< ( counter_read( id ) + 1 ) & ~ counter_read( id ) >, \ cn< ( counter_read( id ) + 1 ) & counter_read( id ) > )
이 접근 방식을 사용하면 고유 식별자를 할당하고 컴파일 시간에 결정된 크기로 데이터 구조를 생성할 수 있습니다. 아래 업데이트된 코드에 표시된 것처럼 이 기술은 C 11의 constexpr 키워드를 사용하여 구현할 수도 있다는 점은 주목할 가치가 있습니다.
#define COUNTER_READ_CRUMB( TAG, RANK, ACC ) counter_crumb( TAG(), constant_index< RANK >(), constant_index< ACC >() ) #define COUNTER_READ( TAG ) COUNTER_READ_CRUMB( TAG, 1, COUNTER_READ_CRUMB( TAG, 2, COUNTER_READ_CRUMB( TAG, 4, COUNTER_READ_CRUMB( TAG, 8, \ COUNTER_READ_CRUMB( TAG, 16, COUNTER_READ_CRUMB( TAG, 32, COUNTER_READ_CRUMB( TAG, 64, COUNTER_READ_CRUMB( TAG, 128, 0 ) ) ) ) ) ) ) ) #define COUNTER_INC( TAG ) \ constexpr \ constant_index< COUNTER_READ( TAG ) + 1 > \ counter_crumb( TAG, constant_index< ( COUNTER_READ( TAG ) + 1 ) & ~ COUNTER_READ( TAG ) >, \ constant_index< ( COUNTER_READ( TAG ) + 1 ) & COUNTER_READ( TAG ) > ) { return {}; }
요약하면 기존 템플릿 메타프로그래밍에는 부작용이 없지만 네임스페이스를 달성하는 것이 가능합니다. -함수 조회 및 앞서 언급한 기술을 활용하여 범위 카운터 기능을 제공합니다. 이러한 방법은 고유 식별자를 동적으로 할당하고 컴파일 타임에 데이터 구조의 크기를 결정하는 실용적인 솔루션을 제공하여 C 애플리케이션의 내부 검사 기능을 향상시킵니다.
위 내용은 함수 조회 및 네임스페이스 범위 기능을 사용하여 C에서 컴파일 시간 카운터를 어떻게 구현할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!