의무적 인 이름 (표준 템플릿 라이브러리)을 제외하고는 ...
C ++은 처음에 OOP 개념을 C에 제시하려고했습니다. 즉, 클래스 및 클래스 계층 구조를 기반으로 특정 엔터티가 수행 할 수있는 작업과 수행 할 수없는 작업을 알 수 있습니다. 다중 상속의 문제와 C ++이 인터페이스 개념을 다소 어색한 방식으로 (자바와 비교하여) 지원한다는 사실로 인해 일부 기능 구성은이 방식으로 설명하기가 더 어렵습니다. 향상).
그런 다음 STL과 함께 템플릿이 작동했습니다. STL은 기존 OOP 개념을 사용하여 대신 템플릿을 사용하여 배수구를 플러시했습니다.
템플릿을 사용하여 템플릿의 형식과 관련이없는 유형을 일반화하기 위해 템플릿을 사용하는 경우 (예 : 컨테이너)가 구분되어야합니다. A가 갖는 vector<int>
완벽한 의미가 있습니다.
그러나 많은 다른 경우 (반복자와 알고리즘)에서 템플릿 형식은 개념의 실제 세부 사항이 템플릿의 구현에 의해 완전히 정의되는 "개념"(입력 반복자, 순방향 반복자 등)을 따라야합니다. 템플릿과 함께 사용되는 유형의 클래스가 아닌 함수 / 클래스.
예를 들어, 함수에 다음을 알려줄 수 있습니다.
void MyFunc(ForwardIterator<...> *I);
업데이트 : 원래 질문에서 명확하지 않았으므로 ForwardIterator는 모든 ForwardIterator 유형을 허용하도록 템플릿을 작성하는 것이 좋습니다. 반대로 ForwardIterator를 개념으로 사용하고 있습니다.
Forward Iterator는 그 정의를 살펴보고 구현 또는 문서를 살펴볼 필요가있는 경우에만 기대합니다.
template <typename Type> void MyFunc(Type *I);
템플릿 사용을 선호하는 두 가지 주장 : vtable을 사용하는 대신 사용 된 각 유형에 맞게 템플릿을 컴파일하여 컴파일 된 코드를보다 효율적으로 만들 수 있습니다. 또한 템플릿을 기본 유형과 함께 사용할 수 있습니다.
그러나 STL을 템플릿 화하기 위해 클래식 OOP를 포기하는 더 깊은 이유를 찾고 있습니까? (당신이 그 거리를 읽었다 고 가정 : P)
vector<int>
과 vector<char>
동시에 사용할 수는. 그들은 물론, 수도,하지만 당신은 사용할 수 있는 동시에 코드의 두 조각을. 템플릿, C ++ 또는 STL과는 아무런 관련이 없습니다. 인스턴스화 vector<int>
에는 vector<char>
코드를로드하거나 실행할 필요 가 없습니다 .