2016-07-22 4 views
1

나는 'D'를 가르치고 있으며, 템플릿에 관해서는 기본적인 질문이 될 수도 있습니다.D 템플릿에서의 이해 D

int foo(int x) 
{ 
    return x; 
} 

string foo(string x) 
{ 
    return x; 
} 

void main() 
{ 
    assert(foo(12345) == 12345); 
    assert(foo("hello") == "hello"); 
} 

물론,이 특정 조각이 우아한 미만 및 템플릿이 반복 제거하는 것입니다 :

을 예를 들어, 나는 현재 (이 게시물의 하단 참조) 읽기하고있는 문서에서는 다음과 같은 코드를 포함
foo(T)(T x) 
{ 
    return x; 
} 

void main() 
{ 
    assert(foo!(int)(12345) == 12345); 
    assert(foo!(string)("hello") == "hello"); 
} 

두 번째 예제는 전달 된 값을 반환하기 때문에 다소 기본입니다. 내 혼란은 실제로 템플릿이있는 함수 인 으로 표시된다는 사실로 인해 하나의 유형의 값으로 제한된다는 것을 알 수 있습니다. 그 이유는 공통적으로 큰 값을 갖는 문자열과 정수 값을 쉽게 상상할 수 없기 때문입니다. 따라서 프로그래머는 전달 된 변수의 유형을 확인한 다음 문자열 또는 정수의 사례를 별도로 처리하는 코드를 작성해야합니까? 대형 함수 몸체를 만드는 것이 더 효율적입니까? 나는 templating에 익숙하지 않은 것이 명백하다는 것을 알았다. 따라서 내 질문 :

http://nomad.so/2013/07/templates-in-d-explained/

+3

https://github.com/PhilippeSigaud/D-templates-tutorial에서 D 템플릿에 대한 전체 책 (무료)을 찾을 수 있습니다. 그것은 훌륭한 읽을 거리입니다. – DejanLekic

답변

4

"템플릿"의 문자 그대로의 정의와 그 컴파일러가하는 일입니다 "다른 사람이 복사 할 수있는 모델 역할을 무엇인가"입니다. 각 유형 (문자열 및 귀하의 경우에는 int)에 대해 템플릿 함수를 복사하고 컴파일하는 동안 특수 함수를 만듭니다.

런타임시 템플리트가 필요하지 않으므로 컴파일 후에 버릴 수 있습니다. 컴파일 된 바이너리에는 두 개의 함수 foo!(int)foo!(string)이 있습니다.

프로그래머는 전달 된 변수 유형을 확인한 다음 문자열 또는 정수의 사례를 별도로 처리하는 코드를 작성해야합니까?

다릅니다. 때로는 그렇게하고 싶어합니다. 예를 들어, 성능을 최적화 할 수 있습니다. 가끔은 그렇게하지 않고 일반적인 함수를 작성할 필요가 없습니다.

대형 함수 몸체를 만드는 것이 더 효율적입니까?

간혹 있습니다. 그렇지 않다면,하지 마십시오. 예를 들어, 하나의 일반 find 함수를 작성할 수 있습니다.이 함수는 배열, 링크 된 목록 및 유사한 항목에서 작동합니다.

1

템플릿은 똑같이 처리하려는 유형에 대한 재사용 가능한 코드입니다. 따라서 '문자열 또는 정수의 사례를 개별적으로 처리하려는 경우 올바른 도구가 아닙니다.

T 요소를 포함하는 임의의 컨테이너를 예제로 가져옵니다. 문자열과 int는 공통점이 많지 않지만 각각에 대해 컨테이너를 만들 수 있습니다.

또 다른 예로는 수학 벡터를들 수 있습니다. 여기서 사용 된 유형을 지정할 수 있습니다. 단일 유형으로 제한하지 않고 수학 함수를 지정할 수 있으며, 필요한 연산자에 과부하가있는 경우 사용자 정의 유형을 사용하여 작업 할 수도 있습니다.