비정적 멤버에 대한 포인터는 전달할 클래스 개체의 이 포인터가 필요하므로 일반 C 함수 포인터와 다릅니다. 따라서 일반 함수 포인터와 비정적 멤버 함수에는 서로 다른 호환되지 않는 시그니처가 있습니다! 특정 클래스의 멤버로 콜백하려는 경우 일반 함수 포인터에서 멤버 함수에 대한 포인터로 코드를 변경하면 됩니다. 그러나 임의의 클래스의 비정적 멤버로 콜백하려면 어떻게 해야 할까요? 그것은 조금 어렵다. 정적 멤버 함수를 래퍼로 작성해야 합니다. 정적 멤버 함수에는 C 함수와 동일한 서명이 있습니다! 그런 다음 멤버 함수를 void*로 호출하려는 개체에 포인터를 캐스팅하고 추가 인수 또는 전역 변수를 통해 래퍼에 전달합니다. 전역 변수를 사용하는 경우 항상 올바른 개체를 가리키는지 확인하는 것이 매우 중요합니다. 물론 멤버 함수에 대한 호출 인수를 통과해야합니다. 래퍼는 void 포인터를 해당 클래스의 인스턴스에 대한 포인터에 캐스팅하고 멤버 함수를 호출합니다. 아래에서 두 가지 예를 찾을 수 있습니다. std:::invoke 또는 멤버 함수 포인터 호출에 매크로를 사용하는 경우 이를 이해할 필요가 없습니다.

아, 그래, std를 사용하십시오 ::호출 또는이 경우 매크로. 그리고 이 경우 std:::invoke 또는 매크로를 사용해야 한다고 언급했습니까??!? 한 가지 가능한 해결책은 정적 멤버를 인터럽트 서비스 루틴으로 사용하고 해당 함수가 인터럽트에서 호출되어야 하는 인스턴스/멤버 쌍을 찾기 위해 어딘가에 보이도록 하는 것입니다. 따라서 그 효과는 멤버 함수가 인터럽트에서 호출되지만 기술적인 이유로 먼저 중간 함수를 호출해야 한다는 것입니다. functionoid 접근 방식은 구식 접근 방식에서는 사용할 수 없는 세 번째 옵션을 제공합니다. 스레드 전역 데이터를 원하는 경우 잠금을 사용할 책임이 있지만 적어도 선택할 수 있습니다. 그것은 쉽게: 내가 이미 암시 했 듯이, functionoids의 장점 중 하나는 배열에 Funct1의 여러 인스턴스를 가질 수 있습니다., 그리고 그 인스턴스는 그들에 동결 건조 다른 매개 변수를 가질 수 있습니다. 예를 들어 array[0] 및 array[1]는 모두 Funct1 형식이지만 배열[0]->doit(12)의 동작은 배열의 동작과 다를 수 있습니다[1]->doit(12) 동작은 doit() 및 ctors에 전달된 12개 모두에 따라 달라지므로 배열입니다. 불행히도 템플릿 바운스 함수를 선언하는 것은 매우 상세할 수 있습니다. 개체의 클래스, 콜백 메서드의 형식을 지정 하 고 클래스 내에서 메서드를 참조 해야 합니다. 확실히 이것은 밖으로 입력하는 재미가 아니다 : 펑터는 함수의 특별한 경우입니다 : 그 방법은 «함수 호출 연산자»연산자()()입니다. 함수 호출 연산자는 오버로드되므로 코드는 함수 호출에 대해 와 같은 구문을 사용하여 주 메서드를 호출할 수 있습니다.

예를 들어, «foo»가 펑터인 경우 «foo» 개체에서 «operator())» 메서드를 호출하면 «foo()»라고 말합니다. 템플릿의 이점은 템플릿에 함수로 사용되는 템플릿 매개 변수를 가질 수 있으며 이 매개 변수는 함수의 이름 또는 functor-object일 수 있습니다. «operator())» 메서드가 인라인될 수 있기 때문에 펑터 오브젝트라는 성능 이점이 있습니다(함수의 주소를 전달하는 경우 반드시 인라인되지 않아야 합니다).