>  기사  >  백엔드 개발  >  `std::function`의 템플릿 인수가 객체 생성 중에 해당 유형에 영향을 줍니까?

`std::function`의 템플릿 인수가 객체 생성 중에 해당 유형에 영향을 줍니까?

DDD
DDD원래의
2024-11-05 22:35:02650검색

Does the Template Argument of `std::function` Influence its Type During Object Construction?

std::function의 템플릿 인수가 해당 유형에 포함되어 있습니까?

문제 소개

std::function 템플릿을 사용할 때 모호함 여러 그럴듯한 과부하로 인해 발생할 수 있습니다. 특히 다음 코드 조각을 고려하세요.

<code class="cpp">#include <functional>

using namespace std;

int a(const function<int()>& f) { return f(); }
int a(const function<int(int)>& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }

int main() {
    a(x); // Call is ambiguous.
    a(y); // Call is ambiguous.
}</code>

두 가지 기능 모두 및 함수 일반 함수 포인터로 구성할 수 있습니다. 이로 인해 a 함수의 오버로드에 대한 여러 잠재적인 일치가 발생합니다.

모호성 해결

std::function에 대한 템플릿 인수의 서명은 선언 및 정의 중에 해당 유형의 일부로 간주됩니다. 그러나 객체 생성 중에는 그렇지 않습니다.

std::function은 C의 많은 기능 객체와 마찬가지로 유형 삭제라는 기술을 사용합니다. 이를 통해 호출 시 예상되는 서명을 충족하는 한 임의의 개체나 함수를 허용할 수 있습니다. 단점은 일치하지 않는 서명과 관련된 오류가 생성자 수준이 아닌 구현 내부 깊은 곳에서 발생한다는 것입니다.

모호성 회피

이 모호성을 우회하기 위한 세 가지 기본 옵션이 있습니다.

  • 명시적 유형 캐스팅: 의도된 오버로드에 필요한 특정 서명에 함수 포인터를 수동으로 캐스팅합니다.
  • 함수 개체 래핑: 다음의 함수 개체를 만듭니다. 적절한 유형을 선택하고 이를 대신 전달합니다.
  • 템플릿 메타프로그래밍(TMP): TMP를 사용하여 명시적인 캐스트를 피하고 원하는 시그니처로 함수를 생성합니다.

결론

std::function의 템플릿 인수는 선언 및 정의 중에 해당 유형을 결정하지만 객체 생성에서는 아무런 역할을 하지 않습니다. 이는 생성자가 임의의 인수를 허용할 때 모호성을 초래할 수 있습니다. 이 문제를 해결하기 위해 프로그래머는 명시적 유형 캐스팅, 함수 개체 래핑 또는 TMP를 사용할 수 있습니다.

위 내용은 `std::function`의 템플릿 인수가 객체 생성 중에 해당 유형에 영향을 줍니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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