개요
콜백: 현재 작업공간의 함수를 외부로 전달하여 외부에서 현재 작업공간의 함수를 호출하게 하는 법을 콜백이라고 부른다.
함수포인터와 콜백: 전역함수는 code영역에 저장된다. 이때 전역함수의 이름은 주소가 되기때문에 함수 포인터로 해당 함수의 이름을 넘겨주는 것으로 함수포인터에 등록이되고 함수포인터를 통해 호출이 가능한다. 즉 함수를 인자로 쓸 수 있다. 하지만 일반 함수포인터로는 클래스의 멤버함수를 등록할 수 없다(용법이 다르다). 하지만 std::function을 이용하면 클래스의 멤버함수를 콜백할 수 있다.
멤버함수포인터로 콜백 호출하는 예
일반함수포인터와는 다르게 멤버함수포인터를 외부에서 선언, 사용할때는 클래스 소속을 명시해야한다. 그리고 실제로 호출할 때는 클래스의 인스턴스를 통해서 호출해야한다. (여기서는 싱글톤으로 선언해서 싱글톤 인스턴스를 호출함)
용법
std::function을 쓰면
함수포인터는 암시적 형변환이 불가능했지만 function은 암시적 형변환을 허용한다. 또한 static 함수 뿐만 아니라 클래스 멤버함수까지 등록가능하다.
function<함수리턴타입(함수인자)> (함수변수이름)
함수변수이름 = bind(함수포인터, (클래스 멤버함수라면 클래스 인스턴스), 인자들 ...)
콜백을 등록하는 싱글톤 클래스(OT_PLUS : 0, OT_MINUS: 1, OT_END: 2)
콜백함수를 등록하고 호출하는 외부 main
위와 같이 전역함수를 등록할 수도, 멤버함수를 등록할 수도 있다.
'2020 이전 > C++' 카테고리의 다른 글
C++의 까다롭고 유별난 친구들 (0) | 2019.03.13 |
---|---|
C++ 함수포인터 넘겨줄 때 명시적 형식이 없습니다 (0) | 2019.02.21 |
C++ auto (0) | 2018.11.28 |
이펙티브 C++ Chapter 5 구현 (0) | 2018.11.12 |
이펙티브 C++ 챕터 4 설계 및 선언 (0) | 2018.10.31 |