문제

"에 대한 실용적인 용도는 무엇입니까?호기심으로 되풀이되는 템플릿 패턴"?"계산 된 수업"일반적으로 표시된 예는 나에게 설득력있는 예가 아닙니다.

도움이 되었습니까?

해결책

시뮬레이션 된 동적 바인딩. 가상 기능 호출 비용을 피하면서 계층 적 이점을 유지하면서 현재 진행중인 프로젝트에서 수행 할 수있는 하위 시스템의 엄청난 승리입니다.

다른 팁

특히 유용합니다 믹스 인 (이는 기능을 제공하기 위해 상속 된 클래스를 의미합니다.

~ 안에 효과적인 C ++, Scott Meyers는 예를 들어 클래스 템플릿 Newhandlersupport를 제공합니다.u003CT> . 여기에는 특정 클래스의 새 핸들러를 무시하는 정적 메소드 (std :: set_new_handler와 같은 방식으로 기본 연산자를 위해 수행하는 것과 동일한 방식으로) 및 핸들러를 사용하는 연산자가 포함됩니다. 유형당 핸들러를 제공하려면 상위 클래스는 어떤 유형이 작용하는지 알아야하므로 클래스 템플릿이어야합니다. 템플릿 매개 변수는 어린이 클래스입니다.

CRTP 없이는 실제로이 작업을 수행 할 수 없었습니다. 뉴 핸들러 지원 템플릿이 별도로 인스턴스화되어야하며,이를 사용하는 클래스 당 현재 new_handler를 저장하기 위해 별도의 정적 데이터 멤버와 함께 개별적으로 인스턴스화해야하기 때문입니다.

분명히 전체 예제는 극도로 스레드-안전이지만 요점을 보여줍니다.

Meyers는 CRTP가 "나를 위해 그것을하기"로 생각할 수 있다고 제안합니다. 나는 이것이 일반적으로 믹스 인의 경우라고 말하며, CRTP는 믹스 인 클래스가 아닌 믹스 인 템플릿이 필요한 경우에 적용됩니다.

슈퍼 클래스로 전달되는 서브 클래스 유형이 메소드 확장 시만 필요하다고 생각하면 CRTP가 호기심이 훨씬 적습니다. 따라서 모든 유형이 정의됩니다. 상징적 서브 클래스 유형을 슈퍼 클래스로 가져 오려면 패턴 만 있으면되지만 모든 공식 템플릿 매개 변수 유형이 정의에 따라 슈퍼 클래스와 관련하여 전달 선언 일뿐입니다.

우리는 다소 수정 된 형태로 사용하여 특성 유형 구조의 서브 클래스를 슈퍼 클래스로 전달하여 슈퍼 클래스가 파생 된 유형의 객체를 반환 할 수 있도록합니다. 이 응용 프로그램은 모든 일반 기능이 슈퍼 클래스에서 구현되는 기하학적 미적분학 (포인트, 벡터, 라인, 상자)을위한 라이브러리이며, 서브 클래스는 특정 유형을 정의합니다. cfltpoint는 tgenpoint의 Cfltpoint 상속입니다. 또한 cfltpoint는 tgenpoint 이전에 존재 했으므로 서브 클래싱은 이것을 리팩토링하는 자연스러운 방법이었습니다.

일반적으로 런타임에 파생 클래스를 선택할 필요가없는 다형성과 같은 패턴에 사용됩니다. 이렇게하면 런타임에 가상 기능 호출의 오버 헤드가 저장 될 수 있습니다.

CRTP를 실제 라이브러리 사용하려면 ATL 및 WTL (wtl.sf.net)을 참조하십시오. 컴파일 타임 다형성을 위해 광범위하게 사용됩니다.

그것은 C 매크로와 같은 느낌이 듭니다. 매크로가 정의 시점이 아니라 사용될 때 컴파일된다는 것을 활용하십시오.

#define CALL_THE_RIGHT_FOO foo()

파일 A :

static void foo() {
   // do file A thing
}
...
CALL_THE_RIGHT_FOO
...

파일 A :

static void foo() {
   // do file B thing
}
...
CALL_THE_RIGHT_FOO
...

설명하는 템플릿 사용 패턴을 사용하면 상위 템플릿에서 "오른쪽 foo 호출"을 허용하여 템플릿이 인스턴스화 될 때까지 오른쪽 foo가 정확히 무엇인지에 대한 정의를 연기합니다. 이 경우를 제외하고는 부모의 t 값에 따라 classa :: foo와 classb :: foo의 구별입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top