함수 포인터를 사용하는 데 아무런 문제가 없습니다. 그러나 비 정적 멤버 함수에 대한 포인터는 일반 함수 포인터와 다릅니다. 멤버 함수는 함수에 대한 암시 적 인수로 전달되는 객체에서 호출되어야합니다. 위의 멤버 함수의 서명은 다음과 같습니다.
void (aClass::*)(int, int)
사용하려는 유형보다는
void (*)(int, int)
한 가지 접근 방식은 멤버 함수를 만드는 것으로 구성 될 수 있습니다. static
이 경우 객체를 호출 할 필요가 없으며 유형과 함께 사용할 수 있습니다 void (*)(int, int)
.
당신이 당신의 클래스의 비 정적 멤버에 액세스해야하는 경우 와 당신이 함수는 C 인터페이스의 일부이기 때문에, 예를 들어, 함수 포인터, 고수해야 할, 당신의 최선의 선택은 항상를 전달하는 void*
함수 포인터와 전화를 복용 함수에 에서 객체를 얻은 void*
다음 멤버 함수를 호출 하는 전달 함수를 통해 멤버.
적절한 C ++ 인터페이스에서는 함수가 임의의 클래스 유형을 사용하기 위해 함수 개체에 대해 템플릿 인수를 사용하도록하는 방법을 살펴볼 수 있습니다. 템플릿 인터페이스를 사용하는 것이 바람직하지 않은 경우 다음과 같이 사용해야합니다 . std::function<void(int, int)>
예를 들어를 사용하여 적절하게 호출 할 수있는 함수 객체를 만들 수 있습니다 std::bind()
.
클래스 유형 또는 적합한 것에 대한 템플릿 인수를 사용하는 유형 안전 접근 방식 은 잘못된 유형으로의 캐스트로 인한 오류 가능성을 제거하므로 인터페이스를 std::function<...>
사용하는 것보다 바람직 void*
합니다.
함수 포인터를 사용하여 멤버 함수를 호출하는 방법을 설명하기 위해 다음 예가 있습니다.
// the function using the function pointers:
void somefunction(void (*fptr)(void*, int, int), void* context) {
fptr(context, 17, 42);
}
void non_member(void*, int i0, int i1) {
std::cout << "I don't need any context! i0=" << i0 << " i1=" << i1 << "\n";
}
struct foo {
void member(int i0, int i1) {
std::cout << "member function: this=" << this << " i0=" << i0 << " i1=" << i1 << "\n";
}
};
void forwarder(void* context, int i0, int i1) {
static_cast<foo*>(context)->member(i0, i1);
}
int main() {
somefunction(&non_member, 0);
foo object;
somefunction(&forwarder, &object);
}