>  기사  >  백엔드 개발  >  함수 정의에서 'enable_if_t'가 실패하는 이유는 무엇입니까?

함수 정의에서 'enable_if_t'가 실패하는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-18 03:21:02263검색

Why Does `enable_if_t` Fail in Function Definitions?

템플릿 인수 충돌: 정의에서 활성화_if_t가 실패하는 이유

템플릿 프로그래밍에서는 조건부 활성화가 필요한 상황에 직면하는 것이 드문 일이 아닙니다. 또는 특정 조건에 따라 템플릿 기능을 비활성화합니다. 이러한 경우 이를 달성하기 위해 std::enable_if 템플릿이 자주 사용됩니다. 그러나 최근 std::enable_if_t의 새로운 구문을 사용하려는 시도로 인해 예상치 못한 오류가 발생했습니다.

아래 코드 조각에서는 std::enable_if:

를 사용하여 두 개의 템플릿 함수 f()를 정의합니다.
template<typename T,
         typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }

template<typename T,
         typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }

새로운 std::enable_if_t 구문을 사용하기 위해 이 코드를 이식할 때 문제가 발생합니다.

template<typename T,
         typename = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }

template<typename T,
         typename = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }

GCC에서 다음 오류가 표시됩니다.

error: redefinition of 'template<class T, class> void g()'
       void g() { }

이 오류가 발생하는 이유를 이해하려면 템플릿 인수의 구문을 조사해야 합니다. 불필요한 코드를 제거하여 함수를 다음과 같이 단순화하여 표현했습니다.

template<
  class T,
  class U/* = std::enable_if_t<std::is_same<int, T>::value>*/
>
void g() { }

template<
  class T,
  class U/* = std::enable_if_t<std::is_same<double, T>::value>*/
>
void g() { }

두 템플릿 모두 서로 다른 기본값에 관계없이 동일한 유형 templatevoid()임이 분명해졌습니다. 두 번째 유형 인수의 경우. 이는 동일한 템플릿 유형의 두 템플릿 함수가 서로 다른 서명을 가져야 한다는 C 요구 사항과 충돌합니다.

이 문제를 해결하려면 두 번째 인수를 종속 유형이 있는 포인터 유형으로 변경할 수 있습니다.

template<
  class T,
  std::enable_if_t<std::is_same<int, T>::value, int>* = nullptr
>
void f() { }

template<
  class T,
  std::enable_if_t<std::is_same<double, T>::value, int>* = nullptr
>
void f() { }

이 수정된 코드에서는 이제 템플릿 함수의 서명이 고유해 충돌이 제거되고 올바른 템플릿 일치가 가능해졌습니다.

위 내용은 함수 정의에서 'enable_if_t'가 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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