> 백엔드 개발 > C++ > std::for_each()에서 오버로드된 함수 모호성을 해결하는 방법은 무엇입니까?

std::for_each()에서 오버로드된 함수 모호성을 해결하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-20 18:55:17
원래의
721명이 탐색했습니다.

How to Resolve Overloaded Function Ambiguity in std::for_each()?

std::for_each() 알고리즘의 오버로드된 함수에 대한 포인터

C에서는 이름은 같지만 매개변수가 다른 함수(함수라고 함)를 가질 수 있습니다. 과부하. 이로 인해 오버로드된 함수를 std::for_each()와 같은 함수에 인수로 전달할 때 모호성이 발생할 수 있습니다.

문제:

다음 코드 조각을 고려하세요.

class A {
    void f(char c);
    void f(int i);

    void scan(const std::string& s) {
        std::for_each(s.begin(), s.end(), f);
    }
};
로그인 후 복사

이 예에서 scan() 메서드는 오버로드된 함수를 전달하려고 시도합니다. f()를 std::for_each()로 변환합니다. 그러나 컴파일러는 사용할 f()의 오버로드를 자동으로 결정할 수 없습니다.

해결책:

원하는 오버로드를 지정하려면 static_cast<>( ) 또는 mem_fun() 함수 포인터.

방법 1: Static_Cast<>()

// 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: Mem_Fun()

f()가 멤버 함수의 경우 mem_fun() 함수 포인터를 사용할 수 있습니다.

std::for_each(s.begin(), s.end(), std::mem_fun(&A::f));
로그인 후 복사

이 접근 방식을 사용하려면 클래스 이름과 오버로드를 지정해야 하며 이는 더 자세하면서도 유연할 수 있습니다.

위 내용은 std::for_each()에서 오버로드된 함수 모호성을 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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