클래스 멤버 함수를 콜백으로 전달
객체 지향 프로그래밍에서는 클래스 멤버 함수를 콜백으로 전달해야 하는 경우가 있습니다. 외부 API. 그러나 이를 직접적으로 시도하면 다음 시나리오에 설명된 것처럼 컴파일 오류가 발생할 수 있습니다.
m_cRedundencyManager->Init(this->RedundancyManagerCallBack);
컴파일러는 함수 포인터에 대한 인수 목록이 누락되었다고 불평하며 대신 &CLoggersInfra::RedundancyManagerCallBack을 사용할 것을 제안합니다. 그러나 여전히 컴파일에 실패합니다.
멤버 함수 이해
솔루션을 살펴보기 전에 멤버 함수의 본질을 이해하는 것이 중요합니다. C에서 멤버 함수는 본질적으로 추가 숨겨진 매개변수인 this를 갖는 일반 함수입니다. 이 숨겨진 매개변수는 함수가 속한 객체 인스턴스를 나타냅니다.
다음 예를 고려하세요.
class A { public: int data; void foo(int addToData) { data += addToData; } };
함수 A::foo는 하나의 매개변수를 사용하지만 내부적으로는 두 개의 매개변수로 작동합니다. : addToData 및 이것. 후자는 foo가 호출되는 A 객체를 가리킵니다. 이 동작은 멤버 함수 구문 an_a_object.foo(5)를 사용할 때 암시적으로 나타납니다. 구문적으로 컴파일러는 이를 A::foo(&an_a_object, 5)로 변환합니다.
콜백 문제
원래 문제로 돌아가서 API의 Init 함수는 다음을 기대합니다. 단일 매개변수를 취하는 함수 포인터. 그러나 CLoggersInfra::RedundancyManagerCallBack과 같은 클래스 멤버 함수에는 본질적으로 숨겨진 이 매개 변수를 포함하여 두 개의 매개 변수가 필요합니다. 이러한 비호환성은 컴파일 오류로 이어집니다.
해결책: Boost 또는 Lambda 함수로 바인딩
기존 솔루션은 Boost의 Boost를 사용하여 멤버 함수를 특정 클래스 인스턴스에 바인딩하는 것입니다. ::bind 라이브러리 또는 C 11의 람다 함수.
boost::bind를 사용하면 새로운 라이브러리를 생성할 수 있습니다. 숨겨진 이 매개변수를 특정 객체 인스턴스에 "잠금"으로써 필요한 매개변수를 취하는 함수입니다. 그런 다음 이 새로운 함수를 콜백으로 전달할 수 있습니다.
#include <boost/bind.hpp> auto bound_callback = boost::bind(&CLoggersInfra::RedundencyManagerCallBack, this); Init(boost::function<void()>(bound_callback));
C 11은 Boost::bind에 대한 더 간단한 대안으로 람다 함수를 제공합니다. Lambda 함수는 this 포인터를 캡처하여 간결한 콜백 바인딩도 가능합니다.
auto lambda_callback = [this]() { RedundancyManagerCallBack(); }; Init(std::function<void()>(lambda_callback));
위 내용은 C 클래스 멤버 함수를 콜백으로 전달하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!