콜백함수 예제 c++

Boost의 signals2를 사용하면 템플릿 없이 스레드 안전 방식으로 제네릭 멤버 함수를 구독할 수 있습니다. 개체 파스칼, Ada, Java 및 C#과 같은 다른 언어와 달리 C++는 클래스의 메서드를 콜백 함수로 전달하는 문제에 대한 기본 솔루션을 제공하지 않습니다. C 언어에서는 이러한 것을 펑터라고 하며 많은 이벤트 기반 응용 프로그램에서 매우 일반적으로 존재합니다. 주요 문제는 특정 클래스의 여러 인스턴스가 각 인스턴스에 대해 서로 다른 메모리 위치를 초래한다는 사실을 중심으로 합니다. 이로 인해 메서드 포인터뿐만 아니라 인스턴스 자체에 대한 포인터도 필요합니다. 문제의 정의는 템플릿의 영역에 속하는 직관적 인 솔루션을 제공하고 시간 인스턴스화 및 전문화 를 컴파일합니다. (3.3 참조) 우리는 그것을 사용할 수있는 더 많은 가능성이 있기 때문에 그 함수에 훨씬 더 많은 유틸리티를 제공합니다 : 예를 들어, 폴더에있는 파일로 작업하려는 경우 – 자신의 루틴으로 API 함수를 호출 할 수 있으며 루틴은 지정된 f에서 파일당 한 번 실행됩니다. 이전. 이렇게 하면 API가 매우 유연해질 수 있습니다. 여기서 (적어도 나를 위해) f_int_t가 새로운 형식별칭이며 함수 포인터 형식의 인식도 더 쉽다는 것이 더 명확합니다. 람다 함수와 리치 히키의 템플릿 펑터 접근 방식 사이에는 두 가지 주요 차이점이 있습니다. 첫째, std::function을 사용하는 대신 약간 더 어설픈 CBFunctor* 형식을 사용해야 합니다. 인수 카운트.

CallBack 클래스 아래의 예제에서 단순화를 위해 0에서 4까지 다양한 인수 수를 가진 메서드를 지원할 수 있으며 이론적으로 더 추가할 수 있습니다. 콜백을 사용하는 한 가지 이유는 호출된 함수의 논리와 독립적이며 다른 콜백과 함께 다시 사용할 수 있는 제네릭 코드를 작성하는 것입니다. DoItA 함수는 콜백을 의미하는 클래스 TClassA의 개체를 통해 작업을 수행합니다. 따라서 클래스 TClassA의 개체에 대 한 포인터와 정적 래퍼 함수 TClassA:::래퍼_To_Call_Display에 대 한 포인터는 DoItA에 전달 됩니다. 이 래퍼는 콜백 함수입니다. TClassA와 같은 임의의 다른 클래스를 작성하고 이러한 다른 클래스가 필요한 함수를 제공하는 한 DoItA에서 사용할 수 있습니다. Nore: 이 솔루션은 콜백 인터페이스를 직접 디자인하는 경우에 유용할 수 있습니다. 전역 변수로 사용하는 두 번째 솔루션보다 훨씬 낫습니다. 콜백의 작동 방식에 의존하지 않는 함수 ca를 작성합니다: 일부 언어에는 일반적으로 이벤트 및 이벤트 처리와 관련된 명시적 콜백 의미 체계가 있는 기능이 포함됩니다.

Kommentarer inaktiverade.