>  기사  >  백엔드 개발  >  `enable_if`를 사용하여 템플릿 매개변수를 기반으로 멤버 함수를 선택하는 방법은 무엇입니까?

`enable_if`를 사용하여 템플릿 매개변수를 기반으로 멤버 함수를 선택하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-25 19:06:39763검색

How to Select a Member Function Based on a Template Parameter Using `enable_if`?

Enable_If 조건을 사용하여 멤버 함수 선택

이 작업은 클래스 템플릿 매개 변수를 기반으로 멤버 함수의 호출을 결정하는 것입니다. 다음 코드 조각은 이를 달성하려고 시도합니다.

<code class="cpp">#include <iostream>
#include <type_traits>

template<typename T>
struct Point
{
  void MyFunction(typename std::enable_if<std::is_same<T, int>::value, T &>::type* = 0)
  {
    std::cout << "T is int." << std::endl;
  }

  void MyFunction(typename std::enable_if<!std::is_same<T, int>::value, float &>::type* = 0)
  {
    std::cout << "T is not int." << std::endl;
  }
};</code>

그러나 이 코드는 "'struct std::enable_if'에 'type'이라는 유형이 없습니다"라는 오류와 함께 컴파일에 실패합니다.

SFINAE 실행

이 문제를 이해하는 열쇠는 SFINAE(대체 실패는 오류가 아님) 개념에 있습니다. Enable_if는 템플릿 인수를 기반으로 조건부 컴파일을 허용합니다. 이 경우 템플릿 인수 T는 멤버 함수가 인스턴스화될 때 이미 알려져 있습니다. 따라서 인스턴스화 시점에 조건이 평가되고 해당 함수가 선택됩니다.

코드 수정

이를 수정하려면 다음과 같은 더미 템플릿 인수를 도입해야 합니다. 기본값은 T입니다. 이를 통해 SFINAE 메커니즘이 의도한 대로 작동할 수 있습니다. 수정된 코드는 다음과 같습니다:

<code class="cpp">template<typename T>
struct Point
{
  template<typename U = T>
  typename std::enable_if<std::is_same<U, int>::value>::type
    MyFunction()
  {
    std::cout << "T is int." << std::endl;
  }

  template<typename U = T>
  typename std::enable_if<std::is_same<U, float>::value>::type
    MyFunction()
  {
    std::cout << "T is not int." << std::endl;
  }
};</code>

명시적 멤버 함수 특수화 방지

HostileFork가 지적한 대로 원본 코드는 템플릿 인수의 명시적 사양을 허용합니다. 멤버 함수의 경우 잘못된 결과가 발생할 수 있습니다. 이를 방지하기 위해 템플릿 인수가 제공되었는지 확인하는 static_assert를 추가할 수 있습니다. 이렇게 하면 템플릿 인수 T를 기반으로 항상 올바른 멤버 함수가 호출됩니다. 수정된 코드는 다음과 같습니다.

<code class="cpp">template<typename T>
struct Point
{
  template<typename... Dummy, typename U = T>
  typename std::enable_if<std::is_same<U, int>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout << "T is int." << std::endl;
  }

  template<typename... Dummy, typename U = T>
  typename std::enable_if<std::is_same<U, float>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout << "T is not int." << std::endl;
  }
};</code>

위 내용은 `enable_if`를 사용하여 템플릿 매개변수를 기반으로 멤버 함수를 선택하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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