template_metaprogramming — 템플릿 메타프로그래밍

template_metaprogramming — 템플릿 메타프로그래밍 (Template metaprogramming)

**템플릿 메타프로그래밍(template metaprogramming)**은 컴파일 타임에 새로운 타입을 만들고 값을 계산하는 기법들의 모음이에요. C++ 템플릿은 재귀적 인스턴스화 수와 허용되는 상태 변수 수에 제한이 없다면 튜링 완전해요.

Erwin Unruh는 위원회 회의에서 컴파일러가 오류 메시지에 소수를 출력하도록 지시해서 처음으로 템플릿 메타프로그래밍을 시연했어요. 표준은 구현이 재귀적 인스턴스화를 최소 1024 단계 지원할 것을 권장하며, 템플릿 인스턴스화의 무한 재귀는 정의되지 않은 동작이에요.

출처: cppreference

본문

템플릿 메타프로그래밍은 컴파일 타임에 새로운 타입을 만들고 값을 계산하는 기법들의 모음이에요. C++ 템플릿은 재귀적 인스턴스화 수와 허용되는 상태 변수 수에 제한이 없다면 튜링 완전해요.

Erwin Unruh는 위원회 회의에서 컴파일러에게 오류 메시지에 소수를 출력하도록 지시해 처음으로 템플릿 메타프로그래밍을 시연했어요. 표준은 구현이 재귀적 인스턴스화를 최소 1024 단계 지원할 것을 권장하며, 템플릿 인스턴스화의 무한 재귀는 정의되지 않은 동작이에요.

메타프로그래밍을 통해 "런타임에 계산할 값을 컴파일 타임에 미리 계산해두는" 방식으로 성능을 끌어올릴 수 있어요. 예를 들어 팩토리얼, 피보나치, 타입 특성(type trait) 계산 등을 컴파일 타임에 수행해, 실행 시 오버헤드를 없앨 수 있답니다.

다음은 메타프로그래밍을 구성하는 핵심 기법들이에요.

  • 특수화 (template specialization)
  • SFINAE
  • ADL
  • 인덱스 시퀀스 (index sequences)
  • 폴드 표현식 (fold expressions)
  • constexpr if

그리고 여기서 쓰이는 용어들로는 다음이 있어요.

  • 특성 (traits)
  • 타입 리스트 (typelists)
  • 메타함수 (metafunctions)

이 분야에서 잘 알려진 라이브러리로는 Boost.MPL, Boost.Mp11, Metal, Kvasir.MPL, Boost.Hana 등이 있어요.

외부 링크

  • David Vandevoorde, Nicolai M. Josuttis, Douglas Gregor (2017), C++ Templates - The Complete Guide, 2nd Edition
  • Wikibook: Template Meta-Programming
  • Wikipedia: Template Meta-Programming

더 알아보기 (Learn more)

cppreference