C ++ 11에는 함수 선언을위한 두 가지 구문이 있습니다.
반환 유형 식별자 (
인수 선언 ... )
과
auto
식별자 (
인수 선언 ... )
->
return_type
동등합니다. 이제 동등 할 때 왜 후자를 사용하고 싶습니까? 음, C ++ 11 decltype
은 표현식의 유형을 설명 할 수있는 이 멋진 것을 도입했습니다 . 따라서 인수 유형에서 반환 유형을 파생시킬 수 있습니다. 그래서 당신은 시도 :
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
컴파일러는 인수 에 무엇이 a
있고 무엇인지 알지 못한다고 알려줍니다 . 이는 인수 목록에 의해서만 선언되기 때문입니다.b
decltype
declval
이미 선언 된 및 템플릿 매개 변수를 사용하여 문제를 쉽게 해결할 수 있습니다 . 처럼:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
지금은 정말 장황 해집니다. 따라서 대체 선언 구문이 제안되고 구현되었으며 이제 다음과 같이 작성할 수 있습니다.
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
덜 장황하고 범위 지정 규칙을 변경할 필요가 없습니다.
C ++ 14 업데이트 : C ++ 14는
auto
식별자 (
인수 선언 ... )
함수가 사용 전에 완전히 정의되고 모든 return
명령문이 동일한 유형으로 추론되는 한. ->
소스 파일에 몸을 숨기려면 구문 (헤더에 선언 된) 공공 기능에 대한 유용한 남아있다. 분명히 템플릿으로는 할 수 없지만, 다른 방법으로는 작성하기 어려운 몇 가지 구체적인 유형 (일반적으로 템플릿 메타 프로그래밍을 통해 파생 됨)이 있습니다.