2020 이전/C++

C++ std::function 콜백

이상해C++ 2019. 2. 6. 16:11

개요


콜백: 현재 작업공간의 함수를 외부로 전달하여 외부에서 현재 작업공간의 함수를 호출하게 하는 법을 콜백이라고 부른다.


함수포인터와 콜백: 전역함수는 code영역에 저장된다. 이때 전역함수의 이름은 주소가 되기때문에 함수 포인터로 해당 함수의 이름을 넘겨주는 것으로 함수포인터에 등록이되고 함수포인터를 통해 호출이 가능한다. 즉 함수를 인자로 쓸 수 있다. 하지만 일반 함수포인터로는 클래스의 멤버함수를 등록할 수 없다(용법이 다르다). 하지만 std::function을 이용하면 클래스의 멤버함수를 콜백할 수 있다.



멤버함수포인터로 콜백 호출하는 예


일반함수포인터와는 다르게 멤버함수포인터를 외부에서 선언, 사용할때는 클래스 소속을 명시해야한다. 그리고 실제로 호출할 때는 클래스의 인스턴스를 통해서 호출해야한다. (여기서는 싱글톤으로 선언해서 싱글톤 인스턴스를 호출함)



용법


std::function을 쓰면

함수포인터는 암시적 형변환이 불가능했지만 function은 암시적 형변환을 허용한다. 또한 static 함수 뿐만 아니라 클래스 멤버함수까지 등록가능하다. 


function<함수리턴타입(함수인자)> (함수변수이름)

함수변수이름 = bind(함수포인터, (클래스 멤버함수라면 클래스 인스턴스), 인자들 ...)


콜백을 등록하는 싱글톤 클래스(OT_PLUS : 0, OT_MINUS: 1, OT_END: 2)


콜백함수를 등록하고 호출하는 외부 main 


위와 같이 전역함수를 등록할 수도, 멤버함수를 등록할 수도 있다.