표준 C++ (이것은 지원되지 않지만 아마도 열심히 보지 못했던 것 같습니다)에 같은 서명이있는 모든 클래스 멤버 함수에 대한 포인터를 선언하는 방법이 있는지 궁금합니다. 예를 들어, X와 Y는일반 멤버 함수 포인터
class X{
int val;
public:
int echoX(int v) {
val = v;
return v; }
int getValue() const { return val; }
};
class Y{
int val;
public:
int echoY(int v) {
val = v;
return v;
}
int getValue() const { return val; }
};
일부 C++ 구현 확장을 통해이 기능을 허용 같은 서명 echoX 및 echoY 방법이 (예를 들어, VCL은 __closure
키워드를 사용한다).
typedef int (__closure *IntFunPtr)(int);
지금, 그것은 호출 할 수있는 함수를 작성하는 사소한 중 하나 X::echoX
또는 Y::echoY
void CallObjectMethod(IntFunPtr fPtr, int val){
fPtr(val);//this can call any member method that accepts an int and returns an int
}
X x, x1;
CallObjectMethod(&x.echoX,4);
CallObjectMethod(&x1.echoX,20);
Y y, y1;
CallObjectMethod(&y.echoY,10);
CallObjectMethod(&y1.echoY,15);
이 기능은 다른 것들 사이에 이벤트 핸들러를 구현하는 데 유용 할 수 있습니다.
당신에게
표준 C++ 접근 오늘하는 것 당신이 당신의 예에서 언급 한 것처럼 지금
그것을 전화 : 예를 들어, 일반적인 펑터를 받아들이거나 (모든 것을 템플릿으로 만들거나'std :: function'을 사용하여), 호출자가 원하는 호출 가능 함수를 인수로 전달하게합니다. 또한 숨겨진 문제를 해결하고 실제 포인터를 객체에 전달해야했습니다. – StoryTeller그리고 이것은 가능한 중복입니다. https://stackoverflow.com/questions/31634887/c-pointer-to-member-function-replacement-forclosure – StoryTeller
글쎄, 이상적으로 우리는 이것을 할 수 있어야합니다. 심지어 단순한 함수 (* std :: function *는 훨씬 더 많은 일을하지만 Samer의 솔루션은 이것으로 충분하다) 에서조차도 그렇다. 감사합니다. –