>백엔드 개발 >C++ >인수 합계를 위해 Variadic 템플릿 함수와 함께 'decltype'을 사용하는 방법은 무엇입니까?

인수 합계를 위해 Variadic 템플릿 함수와 함께 'decltype'을 사용하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-13 04:48:02848검색

How to Use `decltype` with Variadic Template Functions to Sum Arguments?

가변 템플릿 함수와 함께 decltype 사용

decltype을 사용하여 적절한 유형의 합계를 반환하는 가변 템플릿 함수를 작성하려고 하면 예상치 못한 문제가 발생할 수 있습니다.

문제

처음에는 후행 반환 유형 없이 함수가 선언됩니다. 그러나 여러 인수가 전달되면 컴파일러는 함수를 정의되지 않은 것으로 해석합니다. 후행 반환 유형으로 함수를 선언하면 3개 이상의 인수에 대한 문제가 해결되지만 다른 유형의 인수에 대한 반환 유형이 잘못됩니다.

문제

decltype은 다음과 같습니다. 가변 함수 템플릿은 반환 유형이 지정된 후에만 선언되므로 두 개 이상의 인수에 대해 t sum(p...) 유형을 추론할 수 없습니다.

해결 방법

decltype에서 이러한 재귀 호출을 방지하기 위해 사용자 정의 특성 클래스를 사용할 수 있습니다. sum_type 클래스는 재귀 추론 없이 여러 인수에 대한 합계 유형을 결정합니다.

업데이트된 코드

프로그램의 decltype을 유형 이름 sum_type::type은 다음과 같습니다.

#include <iostream>
#include <type_traits>
using namespace std;

template<class T> typename std::add_rvalue_reference<T>::type val();

template<class T> struct id{typedef T type;};

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&amp;>() + val<const U&amp;>() ), P... > {};

이 메서드는 decltype(a (bc)) 대신 decltype((a b) c)를 반환합니다. decltype(a (b c))의 보다 정확한 결과를 얻으려면 마지막 특수화를 다음과 같이 수정하십시오.

template<class T, class U, class... P> struct sum_type<T,U,P...>
: id<decltype(
      val<T>()
    + val<typename sum_type<U,P...>::type>()
)>{};

위 내용은 인수 합계를 위해 Variadic 템플릿 함수와 함께 'decltype'을 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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