7. Templates and Generic Programming

C++의 템플릿과 제네릭 프로그래밍에 대해 알아보자.

41. Understand implicit interfaces and compile-time polymorphism.

템플릿 함수는 템플릿 인자 타입이 만족해야 하는 인터페이스를 묵시적으로 정의하고 인터페이스들 중 호출되는 것을 컴파일 타임에 결정한다.

  • 클래스와 템플릿은 모두 인터페이스와 다형성을 제공한다.
  • 클래스에서 인터페이스는 명시적이고 함수 시그니처를 기반으로 한다. 다형성은 가상 함수를 통해 런타임에 발현된다.
  • 템플릿에서 인터페이스는 묵시적이고 유효한 표현식을 기반으로 한다. 다형성은 템플릿 인스턴스화와 함수 오버로딩 구분을 통해 컴파일 타임에 발현된다.

42. Understand the two meaning of typename.

스코프 내에서 템플릿 인자에 의존적인 타입명을 쓰려면 typename을 붙여 줘야 한다.

  • 템플릿 인자를 선언할 때는 class와 typename은 같다.
  • 중첩 의존 타입명을 쓸 때는 typename을 붙여줘야 한다. 상속받을 기반 클래스 리스트나 멤버 초기화 리스트 내의 기반 클래스에 대해선 예외이다.

43. Know how to access names in templatized base classes.

템플릿 기반 클래스의 멤버 함수는 그대로 상속되지 않는다. 기반 클래스의 템플릿이 그 멤버 함수가 없는 버전으로 특수화될 수 있기 때문이다. 그래서 템플릿 파생 클래스에서 템플릿 기반 클래스의 멤버 함수를 접근하려면 this->를 쓰거나, using 선언을 하거나, 템플릿 기반 클래스의 함수 호출을 함을 명시해주는 방법이 있다.

  • 파생 클래스 템플릿에서는 기반 클래스 템플릿 내 이름을 접근할 때 this->를 쓰거나, using 선언을 하거나, 기반 클래스 템플릿의 이름 호출을 명시하라.

44. Factor parameter-independent code out of templates.

템플릿은 템플릿 인자에 대해 각각 다른 바이너리 코드를 생성하므로 템플릿 인자에 의존성이 없는 코드는 기반 클래스 템플릿을 만들어 private 상속을 하는 방식으로 코드 비대함을 줄이라.

  • 템플릿은 복수의 클래스와 복수의 함수를 생성하므로, 템플릿 인자에 의존적이지 않은 템플릿 코드는 코드 사이즈를 비대하게 한다.
  • 비-타입 템플릿 인자로 인한 비대는 템플릿 인자를 함수 인자 또는 클래스 멤버 함수로 치환해 제거할 수 있다.
  • 타입 인자로 인한 비대는 똑같은 이진 표현을 가지는 인스턴스화 타입에 대해 구현을 공유함으로써 제거할 수 있다.

45. Use member function templates to accept “all compatible types”.

모든 호환 가능한 타입을 수용하려면 멤버 함수 템플릿을 쓴다.

  • 모든 호환 가능한 타입을 수용하려면 멤버 함수 템플릿을 사용하라.
  • 일반화된 복사 생성자와 복사 대입 연산자, 이동 생성자와 이동 대입 연산자에 대한 멤버 함수 템플릿을 정의했다면, 비-템플릿 복사 생성자, 복사 대입 연산자, 이동 생성자와 이동 대입 연산자도 정의해야 한다.

46. Define non-member functions inside templates when type conversions are desired.

형변환이 필요한 경우에는 템플릿 내에 비멤버 프렌드 함수를 정의하라.

  • 모든 인자에 묵시적 형변환을 지원하는 함수 템플릿을 클래스에서 제공해야 할 경우, 클래스 템플릿 내에 비-멤버 프렌드 함수로 정의하라.

47. Use traits classes for information about types.

다른 트레잇에 따라 오버로딩된 워커 함수들 또는 함수 템플릿에 따라 다형성을 구현한 뒤, 마스터 함수나 함수 템플릿으로부터 워커 함수를 트레잇 클래스를 넘겨주면서 호출하라.

  • 트레잇 클래스는 컴파일 타임에 사용 가능한 타입의 정보를 알려준다. 이는 템플릿과 템플릿 특수화로 구현된다.
  • 오버로딩과 합해서, 트레잇 클래스는 타입에 대한 컴파일 타임 if else 체크를 할 수 있게 한다.

48. Be aware of template metaprogramming.

템플릿 메타프로그래밍은 두 가지 장점이 있다. 다른 방법으로는 불가능에 가까운 작업들을 일부 수행할 수 있으며 런타임의 작업을 컴파일 타임으로 옮겨놓을 수 있다. 템플릿 메타프로그래밍의 좋은 활용례는 3가지가 있다. 1) 단위의 정확성 증명. 2) 행렬 연산 최적화. 3) 커스텀 디자인 패턴 구현 생성.

  • 템플릿 메타프로그래밍은 런타임의 작업을 컴파일 타임으로 옮겨놓음으로써 에러를 조기에 발견할 수 있게 하고 런타임 성능을 높인다.
  • 템플릿 메타프로그래밍은 단위전략 기반 커스텀 코드를 생성할 수 있게 하고 특정 타입에 대해 코드 생성을 막는다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중