템플릿 이점
함수 템플릿 은 배열에서 최대 요소 검색과 같이 다양한 데이터 유형에 대해 유사한 작업을 수행해야 할 때 사용됩니다. 템플릿을 적용하는 가장 큰 장점은 각 유형에 대해 별도의 오버로드코드를 지정할 필요가 없다는 것입니다. 각 유형의 오버로드를 여러 개 선언하는 대신
double ArrayMax(double array[])
|
템플릿 함수는 하나만 작성하면 됩니다
template<typename T>
|
코드에 사용하기 위해:
double high[];
|
여기서 사용된 데이터 유형을 지정하는 T 형식 매개변수는 컴파일하는 동안 실제로 적용된 형식으로 대체됩니다. 즉, 컴파일러는 각 유형 (double, datetime, 등)에 대해 별도의 함수를 자동으로 생성합니다. 또한 MQL5를 사용하면 접근 방식의 모든 장점을 사용하여 클래스 템플릿을 개발할 수 있습니다.
클래스 템플릿
클래스 템플릿은 template 키워드를 사용하여 선언되며, 형식 매개 변수 목록을 열거하는 꺽쇠 괄호 <> 를 사용하여 typename 키워드와 함께 선언됩니다. 이 항목은 컴파일러에게 클래스를 구현할 때 실제 변수 유형을 정의하는 T 형식 매개 변수를 가진 일반 클래스를 처리함을 알려줍니다. 예를 들어, T 유형 요소가 있는 배열을 저장하기 위한 벡터 클래스를 생성하겠습니다:
#define TOSTR(x) #x+" " // 객체명 표시 매크로
|
다음으로, 다양한 유형으로 작업할 수 있도록 프로그램에서 세 개의 TArray 개체를 만들기 위해 다른 방법을 적용하겠습니다
void OnStart()
|
스크립트 실행 결과:
double_array (double:10)
|
이제 데이터 유형이 다른 벡터 3개가 있습니다: double, int, string.
클래스 템플릿은 모든 유형의 다른 개체를 캡슐화하기 위해 설계된 개체인 컨테이너 개발에 적합합니다. 컨테이너 개체는 이미 하나의 특정 유형의 개체를 포함하는 컬렉션입니다. 일반적으로 저장된 데이터로 작업하는 것은 컨테이너에 즉시 내장됩니다.
예를 들어, 배열 외부에 있는 요소에 대한 액세스를 허용하지 않는 클래스 템플릿을 작성하여 "범위를 벗어남" 심각 오류를 방지할 수 있습니다.
//+------------------------------------------------------------------+
|
클래스 선언 외부의 메서드를 설명할 때도 템플릿 선언을 사용해야 합니다:
template<typename T>
|
클래스 및 함수 템플릿을 사용하여 "키 – 값" 쌍을 저장하기 위한 맵 컬렉션과 같이 쉼표로 구분된 여러 형식 매개변수를 정의할 수 있습니다:
template<typename Key, template Value>
|
더 보기