template <typename T, typename R, typename ...A>
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); };
그 정확한 의미는 무엇입니까? 도움이 필요합니다 ~`struct decay <T, R (A ..., ...)>의 의미는 무엇입니까?
template <typename T, typename R, typename ...A>
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); };
그 정확한 의미는 무엇입니까? 도움이 필요합니다 ~`struct decay <T, R (A ..., ...)>의 의미는 무엇입니까?
int foo(int);
int bar(int, ...);
이들은 두 가지 다른 기능입니다. foo
은 int(int)
입니다. bar
은 int(int,...)
입니다.
...
은 가변 스타일 템플릿 인수와 혼동하지 말고 C 스타일 varargs이며 ...
도 사용합니다.
template <typename T, typename R, typename ...A>
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); };
boost::hana
내의 std::decay
의 최적화 된 버전의 구현이 부분. typename T
및 T
부분은 빨간색 청어로 최적화 된 제품입니다.
R(A..., ...)
과 일치하는 특수화로, A...
및 R
이 함수 서명에서 추론됩니다. 이 hana::details::decay
에 2 인자로 double(int, char, ...)
을 통과하면
, R
는 double
것 및 A...
는 int, char
이 될 것입니다. ...
은 "C 스타일 가변 태그와 일치"합니다.
이 특수화의 목적은 C 스타일 가변 인수로 끝나는 함수 서명을 동일한 서명에 대한 포인터로 매핑하는 것입니다. 따라서 double(int, char, ...)
을 double(*)(int, char, ...)
으로 매핑합니다.
C 스타일 가변 인수는 템플릿 가변 인수와 다릅니다. 그들은 그것을 predate.
고마워요. 그것이 내가 알고 싶은 것입니다. –
이 전문화는 함수 유형이 함수 포인터 값에 따라 감소하는 방식을 반영하는 함수 유형에 대한 해당 함수 포인터 유형에 대한 감쇠를 규정하는 특수화 중 하나입니다.
이 특수화는 가변 인수 함수 (모든 매개 변수와 일치하지 않는 인수를 허용하도록 매개 변수 목록이 줄임표로 끝나는 함수)에 사용됩니다.
코드를 어디서 봤습니까? 'std :: decay' 구현에 누군가가 합리적으로 사용하는 것과 비슷하지만'T'에 대한 이유는 없습니다 ... 제 첫 번째 가정은 여러분이 잘못 복사 한 것입니다. – Yakk
@Yakk :이 코드는 boost :: hana에서 가져온 것입니다. –
아하 : http://www.boost.org/doc/libs/1_62_0/libs/hana/doc/html/structboost_1_1hana_1_1detail_1_1decay.html 최적화입니다. 다르게 무의미한 디자인을 설명합니다; 그들은 템플릿 인스턴스화의 비효율을 해결하기 위해 노력하고 있습니다. – Yakk