2017-03-27 6 views
6
template <typename T, typename R, typename ...A> 
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); }; 

그 정확한 의미는 무엇입니까? 도움이 필요합니다 ~`struct decay <T, R (A ..., ...)>의 의미는 무엇입니까?

+1

코드를 어디서 봤습니까? 'std :: decay' 구현에 누군가가 합리적으로 사용하는 것과 비슷하지만'T'에 대한 이유는 없습니다 ... 제 첫 번째 가정은 여러분이 잘못 복사 한 것입니다. – Yakk

+0

@Yakk :이 코드는 boost :: hana에서 가져온 것입니다. –

+1

아하 : http://www.boost.org/doc/libs/1_62_0/libs/hana/doc/html/structboost_1_1hana_1_1detail_1_1decay.html 최적화입니다. 다르게 무의미한 디자인을 설명합니다; 그들은 템플릿 인스턴스화의 비효율을 해결하기 위해 노력하고 있습니다. – Yakk

답변

7
int foo(int); 
int bar(int, ...); 

이들은 두 가지 다른 기능입니다. fooint(int)입니다. barint(int,...)입니다.

...은 가변 스타일 템플릿 인수와 혼동하지 말고 C 스타일 varargs이며 ...도 사용합니다.

template <typename T, typename R, typename ...A> 
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); }; 

boost::hana 내의 std::decay의 최적화 된 버전의 구현이 부분. typename TT 부분은 빨간색 청어로 최적화 된 제품입니다.

R(A..., ...)과 일치하는 특수화로, A...R이 함수 서명에서 추론됩니다. 이 hana::details::decay에 2 인자로 double(int, char, ...)을 통과하면

, Rdouble 것 및 A...int, char이 될 것입니다. ...은 "C 스타일 가변 태그와 일치"합니다.

이 특수화의 목적은 C 스타일 가변 인수로 끝나는 함수 서명을 동일한 서명에 대한 포인터로 매핑하는 것입니다. 따라서 double(int, char, ...)double(*)(int, char, ...)으로 매핑합니다.

C 스타일 가변 인수는 템플릿 가변 인수와 다릅니다. 그들은 그것을 predate.

+0

고마워요. 그것이 내가 알고 싶은 것입니다. –

6

이 전문화는 함수 유형이 함수 포인터 값에 따라 감소하는 방식을 반영하는 함수 유형에 대한 해당 함수 포인터 유형에 대한 감쇠를 규정하는 특수화 중 하나입니다.

이 특수화는 가변 인수 함수 (모든 매개 변수와 일치하지 않는 인수를 허용하도록 매개 변수 목록이 줄임표로 끝나는 함수)에 사용됩니다.

+0

그 이유는 왜 두 개의 인수 인'decay'가 있을지 이해할 수 없습니다. – Yakk

+1

'template struct decay {type = R (*)을 사용하여 (A ..., ...); };는 특정 유형의 함수 시그니처를 포착하는'decay '의 특수화입니다. 나는 왜 당신이 두 가지 인자로 된 감쇠 버전을 가지고 있는지 이해하지 못하고, 첫 번째 인자를 무시한다. – Yakk

+0

@KerrekSB : 당신이 말한 것을 이해할 수 없습니다. 더 설명해 주시겠습니까? –