Template vs. Generic

C++ Template vs. C# Generic

  • C++ 은 컴파일이 1번 일어나고, C# 제네릭은 컴파일이 2번 일어난다.
    • C++ 템플릿은 사용하지 않으면 컴파일하지 않는다.
    • 하지만, C# 제네릭은 사용하지 않더라도 그에 관련된 정보를 저장하기 위한 메타데이터가 생성된다.
  • 제네릭은 비형식 탬플릿 매개변수를 허용하지 않는다
  • 제네릭은 명시적 특수화를 지원하지 않는다
  • 제네릭은 부분적 특수화를 지원하지 않는다
  • 템플릿은 템플릿-템플릿 매개 변수를 지원하지만 제네릭은 지원하지 않습니다.
    • C++: template<template class X> class MyClass
  • 제네릭은 제네릭 형식의 기본 클래스로 형식 매개 변수를 허용하지 않지만 템플릿은 허용합니다.

    class A
    {
        // ...
    };
    
    template <class T>
    class B : T
    {
        // ...
    };
    
    • C++에서는 위와 같은 코드가 작동한다
    class A
      {
          // ...
      };
    
      class B<T> : T
      {
          // ...
      };
    
    • C#에서는 위의 코드가 에러를 발생 시킨다
    • 형식 매개변수이므로 T에서 파생될 수 없습니다

차이가 발생하는 이유

  • C++ 템플릿의 경우, 한 번의 컴파일로 최종 결과물 생성
    • 현재 컴파일하는 시점에 해당 코드가 유효한 지 모두 검증 가능
  • 하지만 제너릭의 경우에는 IL 혹은 ByteCode로 컴파일 되더라도 최종이 아님
    • 이를 이용하여 다른 결과물을 도출 가능
    • 때문에 해당 제네릭이 어떻게 사용될 지 첫번째 컴파일에서 결정 불가

형식 매개변수와 실 매개변수

void func(int a)
{
  // a를 가지고 막 뭐를 함
}

// main에서는 func 함수에 인자로 num 변수를 넣음
int main()
{
  int num = 5;
  func(num):
  return 0;
}
  • 위의 코드에서 형식 매개변수는 a
  • 실 매개변수는 num
  • 실 매개변수는 함수 호출 시 실제로 인자로 넣어주는 변수
  • 형식 매개변수는 함수 선언 시 매개 변수로 정의한 변수

출처