티스토리 뷰
많은 사람들이 C++은 객체 지향형 언어라고 알고 있습니다. 이는 틀린 말이 아닙니다. 분명히 C++은 C언어에 여러 가지 요소들을 덧붙여서 객체 지향 패러다임을 구현했습니다. 하지만 설계자들이 처음부터 고려해서 만들지 않은 숨겨진 기능도 있습니다. 지금부터 알아볼 내용은 바로 그 숨겨진 기능입니다. 템플릿(template)은 일반적으로 일반화 프로그래밍(generic programming)을 지원하기 위해서 만들어진 것으로 배웁니다. 곧 타입(type)을 정하지 않고 컴파일 도중에 템플릿 매개변수에 적절한 타입을 집어넣어서 바이너리를 만듭니다. 그런데 조금 더 배우신 분들이나 표준 라이브러리의 std::array를 사용해보신 분들은 템플릿 매개변수에는 타입 외에도 정수형, 열거형, 함수 및 전역 객체에 대한 포인터와 참조들이 가능하다는 것을 알고 있을 겁니다. 또한 템플릿은 재귀적으로 코드를 거슬러 올라가며 치환됩니다.
방금 전의 내용을 요약하자면 다음과 같습니다.
- 템플릿은 컴파일 도중에 평가된다.
- 템플릿 매개변수로는 컴파일 시점에 알려질 수 있는 거의 모든 값들이 가능한다.
- 템플릿은 재귀적이다.
이를 이용하면 말도 안 되는 흑마술인 템플릿 메타프로그래밍(template metaprogramming)이 가능해집니다.
이번 글은 다음의 코드를 실행하는 것으로 끝냅니다.
#include <iostream>
template <int N>
struct Factorial {
enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0> {
enum { value = 1 };
};
int main() { std::cout << Factorial<4>::value << std::endl; }
더보기
Result:
24
C++17을 사용한다면 enum 대신에 static const를 사용해도 됩니다.
'Computer Science > C++' 카테고리의 다른 글
C++17 Template #001 함수 템플릿 (0) | 2020.02.25 |
---|---|
C언어와 C++17의 차이점 (0) | 2020.02.17 |
댓글