모호함 이해: std::function의 서명은 변경할 수 없나요?
C 영역에서 std::function 템플릿은 일반적으로 호출 가능한 객체와 함수 포인터를 캡슐화하는 데 사용됩니다. 그러나 이 템플릿을 다양한 시그니처 기능과 함께 사용할 때 특별한 모호성이 발생합니다. 이러한 혼란의 근본적인 이유를 파헤쳐 보겠습니다.
모호함의 근원
문제의 핵심은 std::function 시그니처의 변경 가능한 것처럼 보이는 특성에 있습니다. 다음 코드 조각을 고려하십시오.
<code class="cpp">int a(const std::function<int()>& f) { return f(); } int a(const std::function<int(int)>& f) { return f(0); }</code>
직관적으로 a(x) 또는 a(y)를 호출할 때(여기서 x는 인수를 사용하지 않는 함수이고 y는 하나의 인수를 사용하는 함수임) 명확한 해결을 기대합니다. 적절한 함수 오버로드. 그러나 컴파일러는 딜레마에 직면합니다.
<code class="cpp">a(x); // Ambiguous a(y); // Ambiguous</code>
이 퍼즐은 std::function
유형 삭제, 범인
이 현상을 이해하기 위해 임의의 함수와 객체를 캡슐화하기 위해 std::/boost::function에서 사용하는 기술인 유형 삭제의 개념을 소개합니다. 유연성을 허용하지만 모호한 변환 가능성이 있습니다.
컴파일러는 오버로드된 집합에 적합한 함수를 식별하려고 시도하면서 함수 매개변수의 생성자 또는 인수의 변환을 사용하여 제공된 인수를 변환하려고 시도합니다. 연산자. 우리의 경우 함수 매개변수의 생성자(즉, std::function)는 거의 모든 것을 허용하므로 변환 시도 중에 모호함이 발생합니다.
그렇다면 서명을 변경할 수 있습니까?
결론적으로 std::function의 시그니처는 선언 및 정의 중에 해당 유형을 정의하는 역할을 합니다. 그러나 이는 초기화 프로세스를 관리하지 않으므로 변경 가능한 것처럼 보이는 서명이 흥미롭게 관찰됩니다.
모호성에 대한 해결 방법
모호성을 피하기 위해 다음을 수행할 수 있습니다. 명시적 캐스트에 의존:
<code class="cpp">a((std::function<int()>)(x)); a((std::function<int(int)>)(y));</code>
또는 함수 개체를 사용하거나 템플릿 메타프로그래밍(TMP)을 활용하여 명시적 캐스트가 필요하지 않도록 할 수도 있습니다. TMP는 장황한 솔루션을 제공하지만 클라이언트에게 캐스팅 작업을 숨깁니다.
전반적으로 유형 삭제 메커니즘을 이해하고 std::function에서 선언 및 초기화 중 유형 간의 구별을 이해하는 것은 이러한 모호성을 방지하는 데 중요합니다. 시나리오.
위 내용은 초기화 후에 std::function 서명을 변경할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!