>백엔드 개발 >C++ >다양한 유형의 인수를 합하는 함수에 대한 올바른 반환 유형을 추론하기 위해 후행 반환 유형을 가변 템플릿 함수와 함께 어떻게 사용할 수 있습니까?

다양한 유형의 인수를 합하는 함수에 대한 올바른 반환 유형을 추론하기 위해 후행 반환 유형을 가변 템플릿 함수와 함께 어떻게 사용할 수 있습니까?

DDD
DDD원래의
2024-11-15 02:26:02431검색

How can trailing return types be used with variadic template functions to deduce the correct return type for a function that sums arguments of varying types?

가변 템플릿 함수와 함께 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::type이 후행 반환 유형에 있으면 함수는 인수 개수에 관계없이 결과 유형을 올바르게 추론합니다.

template <class T, class... P>
auto sum(const T& t, const P&amp;... 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.