>  기사  >  백엔드 개발  >  `std::function`의 템플릿 인수가 과부하 해결 시 모호성을 초래하는 이유는 무엇입니까?

`std::function`의 템플릿 인수가 과부하 해결 시 모호성을 초래하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-06 03:45:02792검색

Why Does `std::function`'s Template Argument Lead to Ambiguity in Overload Resolution?

유형 정의에도 불구하고 Std::Function의 템플릿 인수에 존재하는 모호성

이 시나리오에서는 함수 'a'에 대해 여러 오버로드가 존재합니다. 다음의 뚜렷한 서명을 수락합니다. std::function:

  • function
  • function

모호성은 다음으로 인해 발생합니다. 두 기능 모두 및 함수 동일한 함수로 구성 가능합니다. VS2010에 정의된 std::function 생성자를 사용하면 다양한 소스에서 구성할 수 있습니다.

template<class _Fx>
function(_Fx _Func, typename _Not_integral<!...int>::_Type = 0);

기본적으로 모든 개체를 std::function으로 변환할 수 있으므로 유형 삭제가 용이하고 다음 항목의 처리가 가능합니다. 임의의 객체를 함수로 사용합니다.

문제를 더 자세히 설명하려면 다음과 같은 단순화된 내용을 고려하세요. 예:

template<class Signature>
class myfunc{
   public:
      template<class Func>
      myfunc(Func a_func){
          // ...
      }
};

'a'에 대한 오버로드 해결 중에 실행 가능한 오버로드를 식별할 수 없는 경우 컴파일러는 매개변수의 생성자 또는 인수의 변환 연산자를 사용하여 인수 변환을 시도합니다. 이 경우 변환은 myfunc의 생성자를 통해 발생합니다.

myfunc의 생성자는 무엇이든 허용하므로 function 및 함수 myfunc로 변환될 수 있습니다.

결국 이로 인해 컴파일러는 호출할 'a'의 오버로드를 결정할 수 없게 되어 모호성이 발생합니다.

이 문제를 해결하려면 다음과 같은 여러 가지 옵션이 있습니다.

  1. Explicit 유지 캐스트:
    명시적 캐스트는 컴파일러에 대해 원하는 오버로드를 지정할 수 있습니다: a((functionx))
  2. 함수 개체:
    적절한 유형의 함수 객체를 생성합니다: `function fx = x;
    함수 fy = y;`
  3. 템플릿 메타프로그래밍:
    올바른 서명을 얻기 위해 템플릿 메타프로그래밍을 사용합니다: `template
    struct get_signature{...};`

위 내용은 `std::function`의 템플릿 인수가 과부하 해결 시 모호성을 초래하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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