1. 매개변수
    1. 타입 매개변수(Type parameter)
    2. 비타입 매개변수(Non-Type parameter)
  2. 템플릿 메타 프로그래밍(template metaprogramming : TMP)
    1. 컴파일 도중에 실행되는 템플릿 기반의 프로그램을 작성하는 일.
      1. 1. C++ 컴파일러가 TMP 프로그램 실행
      2. 2. 템플릿에서 인스턴스화된 C++ 소스 코드
      3. 3. 컴파일
  3. 템플릿 클래스를 이용한 ThreadSafe Lock 만들기
    1. CLockObject
      1. CDummyLock
      2. CCriticalSectionLock
      3. CMutexLock
      4. CSemaphore
    2. CScopedLock(CLockObject *pLock)
      1. Lock()
      2. UnLock()
    3. CQue<T,Lock = CDummyLock>
      1. Lock m_LockObject;
    4. 예제
      1. CQue
  4. 템플릿을 사용하는 목적(왜 템플릿이 필요한가?)
    1. 예제코드
    2. 장점
      1. 1. 코딩시간 절약
        1. Logic이 동일하고 타입만 다른 함수나 클래스를 한번만 작성하면 된다.
      2. 2. 코드 중복 회피
        1. 템플릿 인스턴스화에 필요한 타입의 코드만 생성된다.
    3. 단점
      1. 1. 코드 비대화(code bloat)
        1. 명시적인 중복을 제거
          1. 공통성 및 가변성 분석(commonality and variability)
        2. 암시적인 중복(템플릿 코드)을 제거
  5. 기본 템플릿(Primary template)
    1. 기본 템플릿 클래스
  6. 특수화(Specialization)
    1. 예제
      1. 명시적 템플릿 완전 특수화
      2. 명시적 템플릿 부분 특수화
    2. 특수화의 의미
      1. 템플릿 매개변수를 특정한 인수들로 치환해서 생긴 실체 클래스나 함수
        1. 클래스 템플릿
        2. 함수 템플릿
    3. 특수화의 종류
      1. 완전 특수화(full specialization)
        1. 명시적 특수화(explicit specialization)
          1. 특수화의 특성상 템플릿 매개변수를 명시적으로 치환하기 때문에 템플릿 특수화는 모두 명시적 특수화 이다.
      2. 부분 특수화(partial specialization)
  7. 인스턴스화(Instantiation)
    1. 컴파일러가 템플릿에 대한 정보(멤버이름, 기반클래스 이름 등..)를 알아야 하는 순간 인스턴스화 된다.
      1. 1. 컴파일러는 모든 템플릿의 인수값을 채운다.
      2. 2. 가장 일치하는 명시적 특수화, 부분적 특수화를 찾는다.
      3. 3. 템플릿 본문의 선언에 쓰이는 모든 형식과 상수 파악.
      4. 4. 선언에 오류가 없는지 점검.