2017-12-21 12 views
1

표준 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); 

이 기능은 다른 것들 사이에 이벤트 핸들러를 구현하는 데 유용 할 수 있습니다.

당신에게

+0

표준 C++ 접근 오늘하는 것 당신이 당신의 예에서 언급 한 것처럼 지금

template<typename T> void CallObjectMethod(int(T::*func)(int), T& obj, int val) { cout << (obj.*func)(val); } 

그것을 전화 : 예를 들어, 일반적인 펑터를 받아들이거나 (모든 것을 템플릿으로 만들거나'std :: function'을 사용하여), 호출자가 원하는 호출 가능 함수를 인수로 전달하게합니다. 또한 숨겨진 문제를 해결하고 실제 포인터를 객체에 전달해야했습니다. – StoryTeller

+0

그리고 이것은 가능한 중복입니다. https://stackoverflow.com/questions/31634887/c-pointer-to-member-function-replacement-forclosure – StoryTeller

+0

글쎄, 이상적으로 우리는 이것을 할 수 있어야합니다. 심지어 단순한 함수 (* std :: function *는 훨씬 더 많은 일을하지만 Samer의 솔루션은 이것으로 충분하다) 에서조차도 그렇다. 감사합니다. –

답변

1

관심있는 서명을 허용하고 개체의 인스턴스와 멤버 함수에 대한 포인터를 전달하는 템플릿 함수를 만들 수 있습니다.

X x, x1; 
CallObjectMethod(&X::echoX, x, 10); 
CallObjectMethod(&X::echoX, x1, 20); 

하는 객체 Y를 들어 당신은 같은 것을 할 수있는 :

Y y, y1; 
CallObjectMethod(&Y::echoY, y, 10); 
CallObjectMethod(&Y::echoY, y1, 20); 
+0

이것은 실제로 매우 우아한 솔루션입니다. 동적 기능의 템플릿 버전과 비슷합니다. BTW, 난 간단한 정적 함수를 사용하여 생각하고 개체 인스턴스를 전달하지만 이것은 더 좋습니다. –

1

감사가 같은 서명을 해달라고 AFAIK

, 그들은 클래스 인스턴스에 대한 암시 첫 번째 인수가 "예를 들어, X와 Y는 같은 서명 echoX 및 echoY 방법을". 일반적으로 첫 번째 인수를 없애려면 std::function을 선택하십시오.