가변 템플릿 함수와 함께 Dectype을 사용하는 후행 반환 유형
다양한 유형의 인수를 합산하여 반환하는 변형 템플릿 함수를 만들려고 할 때 합계를 적절하게 입력하면 일반적인 문제가 발생합니다.
문제 공식화
decltype을 후행 반환 유형으로 사용하는 기본 구현에서는 2개를 초과하는 인수에 대해 정의되지 않은 동작이 발생합니다. 이를 방지하기 위해 함수를 명시적으로 선언할 수 있지만 이로 인해 여러 인수에 대한 잘못된 유형 추론이 발생합니다.
사용자 정의 특성 클래스를 사용한 솔루션
이러한 문제를 극복하려면, sum_type이라는 사용자 정의 특성 클래스가 활용됩니다. std::add_rvalue_reference 및 std::val을 사용하여 반환 유형을 재귀적으로 계산합니다.
template<class T, class... P> struct sum_type; template<class T> struct sum_type<T> : id<T> {}; template<class T, class U, class... P> struct sum_type<T,U,P...> : sum_type< decltype( val<const T&>() + val<const U&>() ), P... > {};
수정된 구현
decltype을 유형 이름 sum_type
template <class T, class... P> auto sum(const T& t, const P&... p) -> typename sum_type<T,P...>::type { return t + sum(p...); }
향상된 유형 추론
또한 sum_type의 마지막 특수화에 대한 수정은 향상된 유형 추론을 제공합니다.
template<class T, class U, class... P> struct sum_type<T,U,P...> : id<decltype( val<T>() + val<typename sum_type<U,P...>::type>() )>{};
이렇게 하면 반환 유형이 decltype(a (b c))와 일치하여 예상 추가 순서에 맞춰 정렬됩니다.
위 내용은 다양한 유형의 인수를 합하는 함수에 대한 올바른 반환 유형을 추론하기 위해 후행 반환 유형을 가변 템플릿 함수와 함께 어떻게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!