C의 오버로드된 함수 포인터
C에서 오버로드된 함수는 서명이 서로 다른 여러 구현이 포함된 함수입니다. 오버로드된 함수가 일반 알고리즘에 전달되면 어떤 구현을 사용해야 하는지 지정하는 것이 어려울 수 있습니다.
다음 예를 고려하세요.
class A { void f(char c); void f(int i); void scan(const std::string& s) { std::for_each(s.begin(), s.end(), f); // Overloaded function passed to 'for_each' } };
여기에는 클래스 A가 있습니다. 각각 char 및 int를 매개 변수로 사용하는 f라는 두 개의 오버로드된 멤버 함수를 사용합니다. A의 스캔 멤버 함수는 for_each 알고리즘을 사용하여 문자열을 반복하고 각 문자에 대해 f 함수를 호출하려고 시도합니다.
문제:
그러나 컴파일러는 std::for_each에 전달될 때 어떤 f 구현을 사용해야 하는지 자동으로 결정할 수 없습니다. 이는 알고리즘이 특정 시그니처를 가진 함수 포인터를 예상하고 오버로드된 함수 시그니처를 일반 함수 포인터 유형을 기반으로 서로 구별할 수 없기 때문입니다.
해결책:
사용할 f의 오버로드를 지정하려면 다음 기술 중 하나를 사용할 수 있습니다.
1. 함수 서명을 사용한 정적 캐스트:
static_cast<>()를 사용하여 함수 포인터를 std::for_each:
// Uses the void f(char c); overload std::for_each(s.begin(), s.end(), static_cast<void (*)(char)>(f)); // Uses the void f(int i); overload std::for_each(s.begin(), s.end(), static_cast<void (*)(int)>(f));
에 필요한 특정 서명으로 캐스팅할 수 있습니다. 🎜>2. 함수 포인터 선언:
또는 원하는 시그니처로 함수 포인터를 선언하고 이를 오버로드된 함수에 할당할 수 있습니다.void (*fpc)(char) = &A::f; // Function pointer for void f(char c) std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload void (*fpi)(int) = &A::f; // Function pointer for void f(int i) std::for_each(s.begin(), s.end(), fpi); // Uses the void f(int i); overload
멤버 함수의 경우(선택 사항) :
오버로드된 함수가 멤버 함수인 경우 mem_fun 유틸리티 또는 링크된 Dr. Dobb의 기사에 제공된 솔루션을 사용하여 원하는 과부하를 지정할 수 있습니다.위 내용은 C에서 오버로드된 함수 포인터를 전달할 때 모호성을 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!