> 백엔드 개발 > C++ > C 11의 `std::function` 및 `std::bind`는 이기종 클래스 콜백 문제를 어떻게 해결할 수 있습니까?

C 11의 `std::function` 및 `std::bind`는 이기종 클래스 콜백 문제를 어떻게 해결할 수 있습니까?

Mary-Kate Olsen
풀어 주다: 2024-12-15 22:18:17
원래의
621명이 탐색했습니다.

How Can C  11's `std::function` and `std::bind` Solve Heterogeneous Class Callback Challenges?

이기종 클래스 간 콜백 전달

C에서는 다양한 클래스 간에 공유할 수 있는 콜백을 정의하는 것이 어려울 수 있습니다. 정적 멤버 함수를 제공하고 클래스 인스턴스에 포인터를 전달하는 것이 일반적인 접근 방식이지만 유연성이 제한됩니다. C 11의 std::functionstd::bind:

Refactoring EventHandler

정적 메서드와 인스턴스 포인터 대신 리팩터링

EventHandlerstd::function:

class EventHandler {
public:
    void addHandler(std::function<void(int)> callback) {
        // ... (as above)
    }
};
로그인 후 복사
을 수용합니다. 이 함수는 정수 인수를 취하고 아무것도 반환하지 않는 "함수 객체"를 수용합니다.

MyClass 조정

수정

MyClass콜백에서 정적 키워드를 제거하고 대신 인수를 제공합니다.

class MyClass {
public:
    void Callback(int x);
    // ...
};

MyClass::Callback(int x) {
    // ... (as above)
}
로그인 후 복사

콜백에 바인딩하려면 EventHandler 사용 std::bind:

handler->addHandler(std::bind(&MyClass::Callback, this, std::placeholders::_1));
로그인 후 복사

_1 자리 표시자는 단일 인수를 나타냅니다.

독립형 함수 및 람다 표현식

독립형 기능을 직접 사용할 수 있습니다.

addHandler:

void freeStandingCallback(int x) {
    // ...
}

handler->addHandler(freeStandingCallback);
로그인 후 복사
또한

addHandler:

handler->addHandler([](int x) { std::cout << "x is " << x << '\n'; });
로그인 후 복사

내에서 C 11 람다 표현식을 사용할 수 있습니다

채용으로

std::functionstd::bind, 콜백은 이기종 클래스 간에 원활하게 전달될 수 있어 유연성과 코드 재사용성을 제공합니다.

위 내용은 C 11의 `std::function` 및 `std::bind`는 이기종 클래스 콜백 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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