클래스 템플리트 (C++ 전용)

클래스 템플리트와 개별 클래스 간의 관계는 클래스와 개별 오브젝트 간의 관계와 유사합니다. 개별 클래스는 오브젝트 그룹을 구성할 수 있는 방법을 정의하는 반면, 클래스 템플리트는 클래스 그룹을 생성할 수 있는 방법을 정의합니다.

클래스 템플리트템플리트 클래스의 차이점을 참고하십시오.
클래스 템플리트
템플리트 클래스를 생성하는 데 사용되는 템플리트입니다. 클래스 템플리트의 오브젝트를 선언할 수 없습니다.
템플리트 클래스
클래스 템플리트의 인스턴스입니다.
템플리트 정의는 다음을 제외하고 템플리트가 생성할 수 있는 유효한 클래스 정의와 동일합니다.
  • 클래스 템플리트 정의 앞에는 다음이 옵니다.
      template< template-parameter-list >
    여기서 template-parameter-list 는 다음 유형의 템플리트 매개변수 중 하나 이상의 쉼표로 구분된 목록입니다.
    • 유형
    • 비유형
    • 템플리트
  • 클래스 템플리트 내의 유형, 변수, 상수 및 오브젝트는 명시적 유형 (예: int 또는 char) 뿐만 아니라 템플리트 매개변수를 사용하여 선언할 수 있습니다.

C++ 템플리트 매개변수 팩 은 클래스 템플리트에 대한 일종의 매개변수일 수도 있습니다. 자세한 정보는 Variadic 템플리트 (C++11)를 참조하십시오.

정제된 유형 지정자를 사용하여 정의하지 않고 클래스 템플리트를 선언할 수 있습니다. 예를 들면, 다음과 같습니다.
template<class L, class T> class Key;

이는 이름을 클래스 템플리트 이름으로 예약합니다. 클래스 템플리트의 모든 템플리트 선언에는 동일한 유형 및 템플리트 인수 수가 있어야 합니다. 클래스 정의를 포함하는 하나의 템플리트 선언만 허용됩니다.

참고: 중첩된 템플리트 인수 목록이 있는 경우 내부 목록의 끝에 있는 > 와 외부 목록의 끝에 있는 > 사이에 분리 공백이 있어야 합니다. 그렇지 않으면 추출 연산자 >> 와 두 개의 템플리트 목록 구분 기호 >사이에 모호성이 있습니다.
template<class L, class T> class Key;
template<class L> class Vector { /* ... */ }; 

int main ()
{
   class Key <int, Vector<int> > my_key_vector;
   // implicitly instantiates template}

C++11 C++11 만의 시작.

오른쪽 꺾쇠괄호 기능을 사용하는 경우, > > 토큰은 다음 두 조건이 모두 true인 경우 두 개의 연속 > 토큰으로 처리됩니다.

  • >> 토큰은 하나 이상의 왼쪽 꺾쇠괄호가 활성 상태인 컨텍스트에 있습니다. 왼쪽 꺾쇠괄호는 아직 오른쪽 꺾쇠괄호와 일치하지 않을 때 활성화됩니다.
  • >> 토큰은 구분된 표현식 컨텍스트 내에 중첩되지 않습니다.

첫 번째 > 토큰이 template_parameter_list의 컨텍스트에 있는 경우 template_parameter_list의 끝 구분 기호로 처리됩니다. 그렇지 않으면 초과 연산자로 처리됩니다. 두 번째 > 토큰은 엔클로징 template_id template_id 구성 또는 다른 구성 (예: const_cast, dynamic_cast, reinterpret_cast또는 static_cast 연산자) 을 종료합니다. 예를 들면, 다음과 같습니다.

template<typename T> struct list {};
template<typename T> 

struct vector
{
  operator T() const;
} 

int main()
{
  // Valid, same as vector<vector<int> > v;
  vector<vector<int>> v;
  
  // Valid, treat the >> token as two consecutive > tokens.
  // The first > token is treated as the ending delimiter for the
  // template_parameter_list, and the second > token is treated as
  // the ending delimiter for the static_cast operator.
   const vector<int> vi = static_cast<vector<int>>(v);
}

괄호로 묶인 표현식은 구분된 표현식 컨텍스트입니다. template-argument-list내에서 비트 방식 시프트 연산자를 사용하려면 괄호를 사용하여 연산자를 묶으십시오. 예를 들면, 다음과 같습니다.

template <int i> class X {};
template <class T> class Y {}; 

Y<X<(6>>1)>> y;          //Valid: 6>>1 uses the right shift operator

C++11 C++11 의 끝.

개별 템플리트 클래스의 오브젝트 및 함수 멤버는 일반 클래스 멤버 오브젝트 및 함수에 액세스하는 데 사용되는 모든 기술로 액세스할 수 있습니다. 클래스 템플리트가 제공된 경우:
template<class T> class Vehicle
{
public:
    Vehicle() { /* ... */ }    // constructor
    ~Vehicle() {};             // destructor
    T kind[16];
    T* drive();
    static void roadmap();
    // ...
};
및 선언:
Vehicle<char> bicycle; // instantiates the template

생성자, 구성된 오브젝트 및 멤버 함수 drive() 는 다음 중 하나를 사용하여 액세스할 수 있습니다 (표준 헤더 파일 string.h 가 프로그램 파일에 포함되어 있다고 가정함).