티스토리 뷰

많은 사람들이 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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함