제네릭 및 템플릿(Visual C++)
제네릭과 템플릿 매개 변수가 있는 형식에 대 한 지원을 제공 하는 두 언어 기능입니다.그러나 다른 지 고 여러 용도 가집니다.이 항목에서는 여러 가지 차이점에 간략하게를 제공합니다.
자세한 내용은 Windows 런타임 및 관리되는 템플릿(C++ 구성 요소 확장) 및 템플릿 개요을 참조하십시오.
템플릿과 제네릭 비교
제네릭간의 주요 차이점:
제네릭 형식에런타임시 대체 됩니다 때까지 제네릭입니다.여전히 매개 변수가 있는 형식을런타임수 있도록 템플릿컴파일하다타임에 전문화 되어
특히공용 언어 런타임제네릭을 MSIL을 지원합니다.제네릭에 대 한런타임알고 있으므로 특정 형식은 제네릭 형식에 대 한제네릭 형식포함 된어셈블리를 참조 하는 경우 대체할 수 있습니다.다른 어셈블리에서 템플릿, 반대로확인하다컴파일하다타임에 일반적인 형식과 결과 형식으로 특수화할 수 없습니다.
제네릭 특수화 된 두 명의 서로 다른 어셈블리에 형식이 같은 인수 형식이 됩니다.서식 파일에서 두 명의 서로 다른 어셈블리에 형식이 같은 인수런타임서로 다른 것으로 간주 됩니다 특수.
제네릭 (값 형식마다 고유한 구현한 값 형식에 대 한 적용 되지 않음) 모든참조 형식인수에 대해 사용 되는실행 파일코딩하다의 단일 이름으로 생성 됩니다. JIT컴파일러에 대 한제네릭알려지고최적화하다형식 인수로 사용 되는 참조 또는 값 형식에 대 한코딩하다를 만들 수 있습니다. 템플릿의 각 특수화에 대 한 별도런타임코딩하다를 생성합니다.
제네릭 형식 없는템플릿매개 변수를 허용 하지 않음 template <int i> C {}.서식 파일을 수 있습니다.
제네릭을 명시적 특수화 (즉, 특정 형식에 대 한템플릿의 사용자 지정 구현)를 허용 하지 않습니다.서식 파일 작업을 수행합니다.
제네릭부분특수화 (한의 사용자 지정 구현 하위 집합에 대 한 형식 인수)을 허용 하지 않습니다.서식 파일 작업을 수행합니다.
제네릭기본 클래스와제네릭 형식에 대해 사용할 형식매개 변수를 허용 하지 않습니다.서식 파일 작업을 수행합니다.
서식 파일템플릿-템플릿매개 변수 (예: 지원template<template<class T> class X> class MyClass), 있지만제네릭하지 않습니다.
템플릿과 제네릭 결합
- 제네릭의 기본적인 차이점은 템플릿과제네릭결합 응용 프로그램 구축에 대 한 영향을 미칩니다.예를 들어,만들다에 대 한 제네릭래퍼가템플릿을 다른 언어와 일반 노출 하려는템플릿클래스있다고 가정 합니다. 컴파일하다타임에 해당 형식매개 변수를템플릿해야 하므로 해당템플릿있지만, 다음 전달 형식매개 변수제네릭 take를 가질 수 없습니다 있지만 제네릭확인하다유형매개 변수런타임전에 않습니다.때문에확장하다하는 방법은 없습니다 템플릿을 인스턴스화할 수런타임시 임의의 제네릭 형식에 대 한컴파일하다타임에 중첩 제네릭 안에템플릿을 작동 하지 않습니다.
예제
설명
다음은 템플릿과제네릭함께 사용 하는 간단한 예를 보여 줍니다.이 예제에서는클래스템플릿매개 변수를 통해제네릭 형식으로 전달합니다. 그 반대는 불가능합니다.
이러한 방법은 기존 제네릭 API는 Visual C++어셈블리를 로컬템플릿코딩하다를빌드하려고 할 때 나는 추가적인 매개 변수화제네릭 형식으로 여제네릭을 지원지 않습니다. 서식 파일의 특정 기능을 활용 하기 위해 추가 해야 할 때 사용할 수 있습니다.
코드
// templates_and_generics.cpp
// compile with: /clr
using namespace System;
generic <class ItemType>
ref class MyGeneric {
ItemType m_item;
public:
MyGeneric(ItemType item) : m_item(item) {}
void F() {
Console::WriteLine("F");
}
};
template <class T>
public ref class MyRef {
MyGeneric<T>^ ig;
public:
MyRef(T t) {
ig = gcnew MyGeneric<T>(t);
ig->F();
}
};
int main() {
// instantiate the template
MyRef<int>^ mref = gcnew MyRef<int>(11);
}
Output
F