programing

템플릿 클래스와 클래스 템플릿의 차이점은 무엇입니까?

nasanasas 2020. 10. 12. 07:37
반응형

템플릿 클래스와 클래스 템플릿의 차이점은 무엇입니까?


템플릿 클래스와 클래스 템플릿의 차이점은 무엇입니까?


이것은 많은 사람들에게 일반적인 혼란의 지점입니다 (Wikipedia의 Generic Programming 페이지, 일부 C ++ 자습서 및이 페이지의 기타 답변 포함). C ++에 관해서 는 "템플릿 클래스"와 같은 것은 없으며 "클래스 템플릿"만 있습니다. 이 문구를 읽는 방법은 "함수를위한 템플릿"인 "함수 템플릿"과는 반대로 "클래스를위한 템플릿"입니다. 다시 말하지만, 클래스는 템플릿을 정의하지 않고 템플릿은 클래스 (및 함수)를 정의 합니다. 예를 들어, 이것은 템플릿 , 특히 클래스 템플릿 이지만 클래스 아닙니다 .

template<typename T> class MyClassTemplate
{ 
    ...
};

선언 MyClassTemplate<int> 은 클래스 이거나 템플릿을 기반으로하는 클래스입니다. 템플릿 기반 클래스와 템플릿 기반이 아닌 클래스에는 특별한 속성이 없습니다. 특수 속성은 템플릿 자체에 있습니다.

"템플릿 클래스"라는 문구는 아무 의미도 없습니다. C ++에 관한 한 "클래스"라는 명사에 적용될 때 "템플릿"이라는 단어는 형용사로서의 의미가 없기 때문입니다. 그것은의 존재 의미 클래스 입니다 (또는 정의)이 템플릿 C ++에 존재하는 개념이 아니다.

나는 그 단어가 실제 언어에서 "템플릿 클래스"순서로 나타나는 사실에 기반을두고 있기 때문에 일반적인 혼란을 이해합니다. 이것은 완전히 다른 이야기입니다.


차이점은 "템플릿 클래스"라는 용어가 C ++ 표준에 존재하지 않는다는 것입니다. "클래스 템플릿"이라는 용어가 혼란 스럽다고 생각하는 사람들이 주로 사용하는 용어입니다 (Qt 회사 인 Nokia 및 이전 Trolltech처럼).

표준에는 그것에 대한 개념이 없으므로 차이를 만드는 것은 다른 사람들에게 달려 있습니다. 어떤 사람들은 이것을 동의어로 사용하고 다른 사람들은 "템플릿 클래스"라는 용어가 인스턴스화되거나 명시 적으로 특수화 된 클래스 템플릿을 지칭하며, 이는 "클래스 템플릿 전문화"라는 용어와 동일하게 만듭니다. 역사적으로 그것은 이러한 의미를 가졌습니다. 주석달린 참조 설명서 는 343 페이지에서 정의합니다.

클래스 템플릿에서 생성 된 클래스는 template-class-name이름 으로 사용하여 특별히 정의 된 클래스와 같이 템플릿 클래스라고합니다.

non-terminal template-class-name오늘날 Standard에서 사용되는 non-terminal template-id 와 동일하며 아래로 내려옵니다 template-name < arguments >.


모호한 옛 용어를 사용하는 것보다 더 중요한 오늘 용어에 익숙해 지려면

// (1) defines a class template
template<typename T> class A { }; 

// (2) defines a class template explicit specialization 
template<> class A<int> { };

// (3) defines a class template partial specialization
template<typename T> class A<T*> { };

// (4) explicitly instantiates A<char>. 
template class A<char>;

// (5) implicitly instantiates A<short> (because of the member declaration)
struct D { A<short> a; };
  • ARM은 클래스 (2)와 (4) 및 (5) 템플릿 클래스에 의해 생성 된 클래스를 호출했습니다 . ARM이 부분 전문화에 대해 이미 알고 있는지 확실하지 않습니다. 그러나 그렇다면 (3)은 템플릿 클래스라고 부르지 않았습니다. (3)은 클래스를 정의하지 않고 템플릿을 정의하기 때문입니다.
  • 현재 표준은 클래스 (2)와 (4) 및 (5) 클래스 템플릿 전문화에 의해 생성 된 클래스를 호출합니다 . 그리고 (3)은 명시 적 전문화 와 달리 부분 전문화 라고합니다 . 또한 때때로 (3) 전문화 (3.2 / 5-교차 연결을 명확히 함)라고 부르지 만, "전문화"를 "클래스, 함수 또는 클래스"로 정의하기 때문에 이것이 완전히 명확하지는 않습니다. 회원 ", (3)이 만족하지 않습니다.

C ++를 만든 Bjarne Stroustrup은 자신의 저서 The C ++ Programming Language 4th edition , 23.2.1 Defining a Template에서 다음 과 같이 말합니다 .

클래스 템플릿템플릿 클래스 라는 용어를 의미 론적으로 구분하는 사람들이 있습니다 . 나는하지 않는다. 너무 미묘 할 수 있습니다. 이러한 용어는 서로 바꿔서 사용할 수 있습니다. 마찬가지로, 함수 템플릿템플릿 함수 와 교환 할 수 있다고 생각 합니다 .


템플릿 클래스는 템플릿 메소드 디자인 패턴 과 관련이있는 반면, 클래스 템플릿은 "공백 채우기"클래스 템플릿입니다.


클래스 템플릿은 클래스를 생성하는 데 사용되는 템플릿이고 템플릿 클래스는 템플릿에 의해 생성되는 클래스입니다.


템플릿 클래스 : 일반 정의가있는 클래스 또는 클라이언트가 정보를 제공 할 때까지 인스턴스화되지 않는 매개 변수가있는 클래스입니다. 일반 templates.simply 접두사 템플릿 및 T 사용에 대한 전문 용어로 참조됩니다. 클래스 템플릿 : 클래스의 개별 구성은 클래스를 사용하여 개별 객체를 구성하는 방식과 거의 유사한 클래스 템플릿에 의해 지정됩니다. 템플릿 클래스 Ex- classname objectname (argument list)의 객체를 참조합니다.


클래스 템플릿은 다양한 유형의 객체에 대한 일반 클래스입니다. 기본적으로 매개 변수를 기반으로 클래스를 생성하기위한 사양을 제공합니다. 새로운 객체가 생성 될 때마다 그 목적을 위해 새로운 클래스가 메모리에서 발생합니다. 이를 클래스 템플릿 인스턴스화라고하며 클래스의 인스턴스화 된 각 버전을 템플릿 클래스라고합니다.


이 논문을 살펴보십시오 (wg21에서 1992 년에 출판 됨) .

일관된 용어

지금까지 많은 논쟁과 불일치는 템플릿을 설명하는 장에서 사용 된 용어와 관련되어 있습니다. 가장 빈번한 것은 다양한 아이디어와 의도를 표현하기 위해 '기능 템플릿''템플릿 기능'다양하게 적용하는 것입니다 . 일관된 이름 지정이 적용되지 않기 때문에 결과는 혼란과 논쟁입니다.

이 문서의 목적을 위해, 템플릿에 대한 토론에서위원회의 공식 채택을위한 제안 및 문서를 명확히하기위한 목적으로; 나는 후행 '- 템플릿'이 템플릿이 설명하는 유형 또는 기능 집합을 설명하는 형식화를 채택 할 것을 제안 합니다. 그리고 있음을 선도하는 '템플레이트가' 하는 부분의 템플릿 정의를 설명하는 데 사용되는 '-template을' 등으로, 'template-member-function'. 따라서 :-

  • 'function-template': 템플릿이 설명하는 함수 집합으로, 해당 템플릿에 대한 인수로 제공되는 일부 유형 정보에 대한 매개 변수입니다. 예를 들면 :-
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
  • 'class-template': A set of classes described by a template, parametric on some type information provided as argument to that template. For Example :-
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
  • 'template-function': This term is no longer permitted.**
  • 'template-class': This term is not permitted.**

  • 'member-function-template': This term is not permitted, as it describes a property not currently supported by the template definition. Using the above terminology convention, this would describe a member of a non-class-template, whose definition was itself a template. For example :-

class Normal { public:
template<class T> int foo(T*pT)
{ return ( pT == 0 ); }
};

However, since templates are currently limited to the global scope, such a template is invalid.

  • 'template-static-member-function':
  • 'template-member-function':
  • 'template-static-member':
  • 'template-static-data-member 'template-member': Alternative terms for the definition of a member appearing separate to the 'class-template' to which it belongs. For example :-
template<class T> int S<T>::sep_member()
{ return i; }

참고URL : https://stackoverflow.com/questions/879535/what-is-the-difference-between-a-template-class-and-a-class-template

반응형