템플릿 메타프로그래밍과 constexpr(C++11)
간단한 템플릿 메타프로그래밍 예제입니다.
간단한 템플릿 메타프로그래밍 예제 코드 보기
- #include
- using namespace std;
-
- template <unsigned int N>
- struct fibonacci
- {
- enum {
- value = fibonacci<N - 1>::value + fibonacci<N - 2>::value
- };
- };
-
- template <>
- struct fibonacci<1>
- {
- enum {
- value = 1
- };
- };
-
- template <>
- struct fibonacci<0>
- {
- enum {
- value = 1
- };
- };
-
- int main(void)
- {
- cout << fibonacci<10>::value << endl;
-
- return 0;
- }
간단한 템플릿 메타프로그래밍 예제 코드 접기
위 코드의 실행결과는 다음과 같습니다.

위의 예제 코드는 피보니치 수열의 10항(0항부터 시작)을 템플릿 메타프로그래밍을 활용해
컴파일 타임에 계산하는 코드입니다.
이 코드의 컴파일 결과는 다음 코드의 컴파일 결과와 거의 동일합니다.
예제 코드 보기
- #include
- using namespace std;
-
- int main(void)
- {
- cout << 89 << endl;
-
- return 0;
- }
예제 코드 접기
즉 런타임에는 피보나치 수열에 대한 계산을 수행하지 않습니다.
컴파일 타임에 컴파일러가 계산해서 상수로서 결과를 도출합니다.
따라서, 그 결과를 컴파일 타임에 값을 미리 알고 있어야 하는 곳(이를테면 배열의 크기)에 사용할 수 있습니다.
다음처럼 말이죠.
예제 코드 보기
- #include
- using namespace std;
-
- template <unsigned int N>
- struct fibonacci { ... };
-
- int main(void)
- {
- int ary[fibonacci<10>::value] = { 0, };
-
- return 0;
- }
예제 코드 접기
C++11 부터는 템플릿 메타프로그래밍 외에도, constexpr 함수를 사용하여 비슷한 효과를 낼 수 있습니다.
constexpr 예제 코드 보기
- #include
- using namespace std;
-
- constexpr unsigned int fibonacci(unsigned int N)
- {
- return (N <= 1) ? 1 : (fibonacci(N - 1) + fibonacci(N - 2));
- }
-
- int main(void)
- {
- cout << fibonacci(10) << endl;
-
- return 0;
- }
constexpr 예제 코드 접기
constexpr함수는 넘겨받은 인자들이 모두 constexpr 속성인 경우,
템플릿 메타프로그래밍과 마찬가지로 컴파일 타임에 결과를 도출합니다.
따라서 템플릿 메타프로그래밍처럼, 다음과 같은 코드가 가능합니다.
constexpr 예제 코드 보기
- #include
- using namespace std;
-
- constexpr unsigned int fibonacci(unsigned int N)
- {
- return (N <= 1) ? 1 : (fibonacci(N - 1) + fibonacci(N - 2));
- }
-
- int main(void)
- {
- int ary[fibonacci(10)] = { 0, };
-
- return 0;
- }
constexpr 예제 코드 접기
넘겨 받은 인자 중 하나라도 constexpr속성이 아닌 경우에는
통상적인 함수처럼 런타임에 결과를 도출합니다.
따라서 다음과 같이 사용하면 컴파일 오류가 발생합니다.
constexpr 예제 코드 보기
- #include
- using namespace std;
-
- constexpr unsigned int fibonacci(unsigned int N)
- {
- return (N <= 1) ? 1 : (fibonacci(N - 1) + fibonacci(N - 2));
- }
-
- int main(void)
- {
- int n = 10;
- int ary[fibonacci(n)] = { 0, };
-
- return 0;
- }
constexpr 예제 코드 접기
constexpr에 관한 추가적인 내용은
http://ajwmain.iptime.org/programming/book_summary/%5B03%5Deffective_modern_cpp/effective_modern_cpp.html#I15
를 참고하세요.