c++ 콜백 예제
다음 예제에서는 std::functon 함수에 인수로 전달될 수 있는 방법을 보여 주며 있습니다. 여기서는 전달된 함수를 호출하는 래퍼 함수를 만듭니다. 이 예제에서는 다양한 유형의 인수에 대처하기 위해 이러한 함수를 오버로드하는 방법을 보여 주며 있습니다. foo1에 대한 코드는 이전과 동일하며 여기에 생략됩니다. 마지막으로 위에 만든 인덱스를 사용하여 래퍼 함수를 통해 콜백을 호출할 수 있습니다. API의 동작 또는 결과는 우리가 제공하는 콜백에 따라 달라집니다. 위의 함수의 경우 func1을 선언하여 함수에 대한 포인터를 가져 와서 런타임에 func2의 주소를 전달하십시오. typedef를 사용하여 지저분한 구문을 더 쉽게 읽고 디버깅할 수 있습니다. 예제 15-1은 함수 포인터를 사용하여 콜백 함수를 구현하는 방법을 보여 주며 있습니다. 이 암호화 함수는 문자열의 모든 문자를 1로 줄입니다. 이제 호출 빌드 메시지 API가 콜백으로 이 기능을 할 수 있습니다, 콜백은 주어진 시간에 인수를 다시 호출 (실행)할 것으로 예상되는 다른 코드에 인수로 전달되는 실행 가능한 코드입니다 [Source : Wiki]. 간단한 언어로 함수의 참조가 함수를 호출하는 인수로 다른 함수에 전달되면 콜백 함수로 호출됩니다.
일부 C 함수를 C++ 콜백과 인터페이스하려면 어떻게 해야 합니까? 콜백을 호출하는 것은 좋지만 나중에 호출할 수 있도록 콜백 목록을 저장해야 하는 경우가 많습니다. 일반적으로 이러한 유형의 코드는 이벤트에 대한 알림을 받는 클라이언트를 등록하는 데 사용됩니다. 콜백을 등록하려면 정적 멤버 함수의 함수 포인터를 참조하기만 하면 됩니다. DoItB 함수는 콜백을 의미하는 클래스 TClassB의 개체를 통해 작업을 수행합니다. 정적 함수 TClassB::래퍼_To_Call_Display에 대한 포인터가 DoItB에 전달됩니다. 이 래퍼는 콜백 함수입니다. 래퍼는 전역 변수 void* pt2Object를 사용하고 이를 TClassB의 인스턴스에 명시적으로 캐스팅합니다. 올바른 클래스 인스턴스를 가리키도록 전역 변수를 항상 초기화하는 것이 매우 중요합니다. TClassB와 같은 임의의 다른 클래스를 작성하고 이러한 다른 클래스가 필요한 함수를 제공하는 한 DoItB와 함께 사용할 수 있습니다. 참고: 이 솔루션은 변경할 수 없는 기존 콜백 인터페이스가 있는 경우에 유용할 수 있습니다. 전역 변수를 사용하는 것은 매우 위험하며 심각한 오류를 일으킬 수 있으므로 좋은 해결책이 아닙니다.
이 문서에서는 std:::function이 다양한 시나리오에서 콜백으로 사용될 수 있는 방법에 대해 설명합니다. 내 경력을 통해 발생 한 C 구현의 대부분은 매우 간단하다 : 그들은 단지 하나의 포인터를 등록 할 수 있습니다! 예를 들어 std::vector를 사용하면 하나의 함수를 사용하여 콜백을 목록에 푸시할 수 있습니다. 함수 포인터 콜백을 인수로 허용하는 프레임워크의 API는 다음과 같이 보여 주며, API의 동작 또는 결과는 인수로 전달된 콜백에 종속됩니다.