> 백엔드 개발 > C++ > C에서 오버로드된 함수 포인터를 전달할 때 모호성을 해결하는 방법은 무엇입니까?

C에서 오버로드된 함수 포인터를 전달할 때 모호성을 해결하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-24 11:16:11
원래의
526명이 탐색했습니다.

How to Resolve Ambiguity When Passing Overloaded Function Pointers in C  ?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿