Visual C++의 제네릭 개요

제네릭공용 언어 런타임지 원하는 매개 변수가 있는 형식입니다.매개 변수가 있는 형식에 제네릭을 사용할 때 지정 된 알 수 없는 형식매개 변수를 정의 하는 형식입니다.

이유는 제네릭을?

C + + 템플릿을 지원 하 고 템플릿과제네릭매개 변수가 있는 형식만들다를 지 원하는컬렉션클래스를 입력 합니다.그러나 템플릿컴파일하다제공-시간 매개 변수화 합니다.만들다새 특수화는템플릿및템플릿정의 포함 하는어셈블리를 참조할 수 없습니다.컴파일 후템플릿특수화 된 다른클래스또는메서드다음과 같이 보입니다.반면,제네릭는 내보낸 MSIL은런타임는매개 변수가 있는 형식으로 알려진매개 변수가 있는 형식으로. 소스제네릭 형식을 포함 하는어셈블리를 참조 하는코딩하다제네릭 형식의 특수화를만들다수 있습니다. Visual C++ 템플릿과제네릭에 대 한 자세한 내용은 비교를 참조 하십시오. 제네릭 및 템플릿(Visual C++).

일반 함수 및 형식

이러한관리형식으로 클래스 형식이 제네릭일 수 있습니다.경우를 예로 들 수 있는 List클래스입니다. 목록에서개체의 형식을 형식매개 변수됩니다.필요한 경우는 List다양 한 종류의제네릭을 있을 수도 사용 하기 전에 개체에 대 한클래스List 는 System::Object 항목형식. 하지만는 (잘못 된 형식의 개체를 포함 하 여) 모든개체목록에서 사용할 수 있습니다.이러한 목록은 형식화 되지 않은컬렉션클래스호출 됩니다.런타임형식을 확인 하 고예외를 throw 할 수 있습니다.또는 한 번어셈블리를 컴파일한 일반 품질 손실 됩니다템플릿을 사용 합니다.어셈블리소비자가 자신의 특수화를템플릿만들다수 없습니다.제네릭을 사용 하면만들다형식의컬렉션클래스를 예를 들어 List<int> (읽기 "로 int의 목록") 및 List<double> ("목록")를 두 번 됩니다 생성 된컴파일하다-시간오류컬렉션되지 않은 형식을 두 려 하는 경우 형식화 된컬렉션에 적용 하도록 설계 되었습니다.또한 이들은 컴파일된 후 이러한 형식은 제네릭 남아 있습니다.

제네릭 클래스의 구문에 대 한 설명에서 찾을 수 제네릭 클래스(C++/CLI). 새네임스페이스를 System.Collections.Generic, 포함 하 여 매개 변수가 있는컬렉션형식 집합이 도입 되었습니다 Dictionary<TKey, TValue>, List<T>LinkedList<T>.자세한 내용은 .NET Framework 클래스 라이브러리의 제네릭(C# 프로그래밍 가이드)를 참조하십시오.

둘 다고정적인및 인스턴스클래스멤버 함수, 대리자 및 전역 함수 제네릭 될 수도 있습니다. 제네릭 함수 경우 알 수 없는 형식의함수매개 변수 또는함수자체는 제네릭 형식으로 작업 해야 할 경우 필요할 수 있습니다.대부분의 경우에서 어디 System::Object 사용할 수 있습니다 이전에 알 수 없는개체형식에 대 한매개 변수변수로제네릭 형식매개 변수대신에 대 한 자세한형식이 안전한코딩하다수 있도록 사용할 수 있습니다. 함수에 대 한 설계 되지 않았습니다 하는 형식을 전달 하려고컴파일하다타임에오류플래그가 지정 됩니다.사용 하 여 System::Object 는함수매개 변수, 실수로 전달함수처리 하려고 하지 않은개체를 검색할 수 없습니다, 및함수본문에 알 수 없는개체형식을 특정 형식으로 캐스팅 하는 Invalidcastexception의 가능성을 고려 해야 합니다. 일반함수본문이 올바른 형식으로 보장 되지개체를함수에 전달 하는코딩하다형식 충돌을 일으킬 수 있습니다.

동일적용하다구축에서제네릭컬렉션클래스를 활용 합니다.컬렉션 클래스는 과거에 사용 System::Object 컬렉션의 요소를 저장 합니다.개체가 삽입 된 경우에 때 삽입 된 개체의컬렉션에 대 한 설계 되지 않은 형식컴파일하다시 고 자주 표시 했습니다.일반적으로컬렉션에 액세스할 때개체다른 형식으로 캐스팅 합니다.예기치 않은 형식 캐스팅만 실패 때 감지 됩니다.제네릭이이 문제를 해결컴파일하다타임에 모든코딩하다와 일치 하지 않는 형식 삽입 (또는 암시적으로변환하다)을 감지 하 여 제네릭컬렉션의 형식매개 변수입니다.

구문에 대 한 설명은 참조 하십시오. 제네릭 함수(C++/CLI).

제네릭을 사용 하는 용어

c570k3f3.collapse_all(ko-kr,VS.110).gif형식 매개 변수

제네릭선언이라는 하나 이상의 알 수 없는 형식을 포함 형식 매개 변수.형식 매개 변수 이름은 제네릭선언본문에서 형식을 나타냅니다는 제공 됩니다.제네릭선언본문에서 형식을 형식매개 변수사용 됩니다.<T> 목록에 대해 제네릭선언 형식매개 변수t도 포함 되어 있습니다.

c570k3f3.collapse_all(ko-kr,VS.110).gif형식 인수

해당 형식인수 실제 형식이 generic 특정 형식 또는 형식에 대 한 특수화 된 형식매개 변수대신 사용 됩니다.예를 들어, int 의 형식인수입니다 List<int>.값 형식 및 형식핸들와제네릭 형식인수에 사용할 형식 뿐입니다.

c570k3f3.collapse_all(ko-kr,VS.110).gif생성 된 형식

제네릭 형식에서 생성 된 형식으로 참조 되는 생성 된 형식.완전히, 같은 지정 하는 형식 List<T> 되는 생성 된 형식시작됨. 완벽 하 게, 같은 지정 하는 형식 List<double>, 되는 폐쇄형된 생성된 형식 또는 특별 한 형식.개방형 생성된 형식이 다른 제네릭 형식 또는 메서드 정의에 사용할 수 있습니다 및 바깥쪽 제네릭 자체 지정 될 때까지 완전 하 게 지정 될 수 있습니다.예를 들어, 다음 구성시작됨형식의 제네릭에 대 한를 사용기본 클래스입니다.

// generics_overview.cpp

// compile with: /clr /c

generic <typename T>

ref class List {};

generic <typename T>

ref class Queue : public List<T> {};

c570k3f3.collapse_all(ko-kr,VS.110).gif제약 조건

제약 조건은 형식매개 변수변수로 사용할 수 있는 형식에 대 한 제한입니다.예를 들어, 지정 된 제네릭클래스지정 된클래스에서 상속 하는 클래스에만 적용 하거나 지정 된인터페이스를 구현할 수 있습니다.자세한 내용은 제네릭 형식 매개 변수에 대한 제약 조건(C++/CLI)를 참조하십시오.

참조 형식과 값 형식

핸들 형식 및 값 형식은 형식 인수로 사용할 수 있습니다.Generic 정의 모두 사용할 수 있습니다, 참조 형식의 구문이입니다.예를 들어 있는 ->연산자최종적으로 사용 되는 형식을참조 형식또는값 형식인지 여부의매개 변수형식 멤버에 액세스 하는 데 사용 됩니다. 값 형식인수형식으로 사용할 때런타임값 형식은 값 형식을boxing하지 않고 직접 사용 하 여코딩하다를 생성 합니다.

참조 형식으로제네릭 형식인수를 사용 하는 경우핸들구문을 사용 합니다. 값 형식으로제네릭 형식인수를 사용 하는 경우에 직접 형식 이름을 사용 합니다.

// generics_overview_2.cpp

// compile with: /clr

generic <typename T>

ref class GenericType {};

ref class ReferenceType {};

value struct ValueType {};

int main() {

GenericType<ReferenceType^> x;

GenericType<ValueType> y;

}

형식 매개 변수

제네릭클래스형식 매개 변수에 다른 식별자와 같이 취급 됩니다.그러나 형식을 알 수 없으므로 사용 상의 제한이 있습니다.예를 들어, 이러한 멤버를 지원 하기 위해 형식매개 변수라고 하는 경우가 아니면 멤버 및 메서드를클래스형식매개 변수사용할 수 없습니다. 즉, 형식매개 변수를 통해 멤버에 액세스 하려면 멤버 형식매개 변수변수의제약 조건목록에 포함 된 형식을 추가 해야 합니다.

// generics_overview_3.cpp

// compile with: /clr

interface class I {
   void f1();
   void f2();
};

ref struct R : public I {
   virtual void f1() {}
   virtual void f2() {} 
   virtual void f3() {} 
};

generic <typename T>
where T : I
void f(T t) {
   t->f1();
   t->f2();
   safe_cast<R^>(t)->f3();
}

int main() {
   f(gcnew R());
}

이러한 제한적용하다에도 운영자.무제한제네릭 형식매개 변수를 사용할 수 있습니다지 않습니다는 == 및 != 이러한 연산자 형식매개 변수대/소문자형식의 두 인스턴스를 비교 하는 연산자를 지원 하지 않습니다. 이 검사에 대 한제네릭필요 하지만클래스는런타임시제네릭특수화할 수 있기 때문에 템플릿의 경우에 제약 조건, 만족 하지 때가 너무 늦게잘못된멤버에 대해 사용을 확인 합니다.

기본 인스턴스는 형식매개 변수를 사용 하 여 만들 수 있습니다의 ()연산자입니다. 예를 들면 다음과 같습니다.

T t = T();

위치 T , 제네릭클래스또는메서드정의의 형식매개 변수변수기본값초기화 합니다.경우 T null포인터; 수 ref클래스입니다 경우 T 값클래스,개체는영으로 초기화 됩니다.이 호출 되는 기본 이니셜라이저.

참고 항목

기타 리소스

제네릭(C++ 구성 요소 확장)