2012-11-10 3 views
-1
내가 책 "템플릿 compelte 가이드"읽고 있었다

, I 섹션 :기능 서명 : C++ 템플릿 완전한 가이드

그것의 반환 유형의 경우 : 12.2.1 서명이 나는 저자의 문장을 이해할 수 없었다 함수는 함수 템플릿에서 생성됩니다.

"함수 템플릿에서 생성 된 함수"는 무엇을 의미합니까? , 여기서 템플릿 ID에 대해 이야기하고 있습니까? 그렇다면 왜 서명이 우리에 의해 정의 되었기 때문에 반환 유형이이 경우 중요합니까?

간단한 예제가 도움이 될 것입니다. 감사합니다.

+1

A :

(이 본래 의도하지 않았다하더라도) 상이한 반환형 공존과 기능을 갖는 주요 용도는, 예를 들면, 상태에 기초하여 과부하 세트에서 이러한 기능의 일부를 제거하는 것 책을 가지고 있지 않은 사람들에게 더 완벽한 인용문은 저자가 문맥에서 이야기하고있는 것을 이해하는 데 도움이 될 수 있습니다. –

답변

2

12.2.1 절에서 저자는 기능 선언이 공존 할 수있는 상황을 설명합니다. 그들은 예를 들어, 다른 반환 형식이있는 경우 기능 템플릿의 선언도 공존 할 수 있습니다, 당신은 선언 할 수 있습니다 :이 기능 이외의 템플릿을 만들 경우

template <typename T> int f(); 
tepmlate <typename T> char f(); 

, 당신도 그들을 선언 할 수 없습니다. 물론 위의 형식에서 캐스트를 사용하여 함수 중 하나를 명시 적으로 선택할 수는 있지만 함수를 호출 할 수는 없습니다 (이 점에 대해서는 확실하지 않습니다).

template <typename T> 
typename std::enable_if<std::numeric_limits<T>::is_specialized, T>::type 
f(T); // used for types for which std::numeric_limits<T> is specialied 

template <typename T> 
typename std::enable_if<!std::numeric_limits<T>::is_specialized, T>::type 
f(T); // used for types for which std::numeric_limits<T> is not specialied 
+0

캐스트가 작동한다고 생각하지 않습니다. 문제는 'T'를 제공 할 수 없다는 것입니다 :'f '이 모호합니다. T가 두 템플리트의 추론 된 매개 변수 (즉,'int f (T)') 인 경우'int (* p) (double) = & f'가 캐스트 없이도 작동합니다. 오버로드 세트'f'에는 정확한 타입의 함수가 하나뿐입니다. – MSalters

+0

최악의 질문에 대한 답장을 보내 주시면 감사하겠습니다. (이 Q는 더 많은 언어 문제입니다.)하지만 필자는 작성자가 무엇인지, 그리고 단순히'return 기능 템플릿의 종류'? – M3taSpl0it

+0

@ M3taSpl0it : 함수 템플릿은 함수는 아니지만이 섹션에서는 함수 템플릿 대신 실제 함수에서 작동하는 오버로드 집합의 상호 작용을 설명하려고합니다. 함수 템플릿에서 함수를 얻으려면 "생성"해야합니다. 내 생각에, 일반적으로 용어 * 인스턴스화 *가 사용되지만 저자가이 용어를 사용하지 않은 이유를 모르겠습니다. –