템플릿 메타프로그래밍과 constexpr(C++11)

간단한 템플릿 메타프로그래밍 예제입니다.

간단한 템플릿 메타프로그래밍 예제 코드 보기

위 코드의 실행결과는 다음과 같습니다.

CPP3-1 실행 결과

위의 예제 코드는 피보니치 수열의 10항(0항부터 시작)을 템플릿 메타프로그래밍을 활용해 컴파일 타임에 계산하는 코드입니다.

이 코드의 컴파일 결과는 다음 코드의 컴파일 결과와 거의 동일합니다.

예제 코드 보기

즉 런타임에는 피보나치 수열에 대한 계산을 수행하지 않습니다. 컴파일 타임에 컴파일러가 계산해서 상수로서 결과를 도출합니다.

따라서, 그 결과를 컴파일 타임에 값을 미리 알고 있어야 하는 곳(이를테면 배열의 크기)에 사용할 수 있습니다. 다음처럼 말이죠.

예제 코드 보기

C++11 부터는 템플릿 메타프로그래밍 외에도, constexpr 함수를 사용하여 비슷한 효과를 낼 수 있습니다.

constexpr 예제 코드 보기

constexpr함수는 넘겨받은 인자들이 모두 constexpr 속성인 경우, 템플릿 메타프로그래밍과 마찬가지로 컴파일 타임에 결과를 도출합니다.

따라서 템플릿 메타프로그래밍처럼, 다음과 같은 코드가 가능합니다.

constexpr 예제 코드 보기

넘겨 받은 인자 중 하나라도 constexpr속성이 아닌 경우에는 통상적인 함수처럼 런타임에 결과를 도출합니다.
따라서 다음과 같이 사용하면 컴파일 오류가 발생합니다.

constexpr 예제 코드 보기

constexpr에 관한 추가적인 내용은

http://ajwmain.iptime.org/programming/book_summary/%5B03%5Deffective_modern_cpp/effective_modern_cpp.html#I15

를 참고하세요.





다른 글들의 목록을 보려면 이 이미지를 클릭해 주세요.