2017-03-01 13 views
-1

특정 클래스 유형의 C++ 클래스 비 정적 멤버에 대한 함수 포인터를 만드는 방법에 대한 예제가 많이 있습니다. 그러나, 타입 클래스에서 작동하는 포인터를 사용해야합니다. 아이디어를 설명하기 위해 나는 의사적인 예를 썼다.모든 클래스 유형의 비 정적 멤버 함수에 대한 C++ 함수 포인터

class A 
{ 
    public: 
    A(){} //constructor  
    void callMe() { /* do something */ } 
}; 

class B 
{ 
    public: 
    B(){} //constructor  
    void callMe() { /* do something */ } 
}; 


main() 
{ 
    A aa; 
    B bb; 

    //pseudo part: 
    generic_method_pointer_type p; //how to define the type of p? 

    p=HOWTO;//set pointer p to point to A::callMe. How to do? 

    p(aa); //A::callMe on instance aa gets called 

    p=HOWTO;//set pointer p to point to B::callMe. How to do? 

    p(bb); //B::callMe on instance bb gets called 
} 

이 모양이 가능합니까?

C++ 11에는 std :: function과 같은 새로운 트릭이 있음을 알고 있습니다. 나는 std :: function에 대해 몇 가지 실험을했고 작은 마이크로 컨트롤러에서 실행되는 실시간 앱에 너무 느리다. 그래서 최소의 오버 헤드를 유발하는 직접 하드 코딩 된 포인터를 선호합니다.

감사합니다.

+0

제공 한 태그, 특히 member-function-pointer 아래의 게시물을 읽었습니까? –

+0

그물 전체를 검색하는 데 두 시간 걸렸습니다. 당신이 대답에 대한 링크를 알고 있다면, 나는 그것을 고맙게 생각할 것입니다. – TeroK

+1

'p = & A :: callMe;를 설정하고'p (bb);'를하면 어떻게 될 것으로 예상됩니까? – aschepler

답변

0
MBED 프로젝트 소스 코드 (자신의 FunctionPointer 클래스)에서

하나 개 찾았 완벽하게 작동 솔루션 :

근무 예 :

A foo; 
FunctionPointer cb; 
cb.attach(&foo,&A::callMe); 
for(i=0;i<100000000;i++) //callback overhead test 
    cb.call(); 

FunctionPointer 내의 코드는 어떻게 작동하는지 잘 알려지지 않았습니다. 그것 memcpy 일부 데이터 등 모든 아이디어가 단순화 될 수 있다면 & 더 빨라 졌는가? callMe는 ("NOP") 만 ASM 포함 된 경우

A foo; 
typedef void (A::*MethodPtr)(); 
MethodPtr method = &A::callMe; 
Foo *obj = &foo; 
for(i=0;i<100000000;i++) //callback overhead test 
    (obj->*method)(); 

상기 방법 FunctionPointer 방법에 비해 약 4 배 빠르다 : 아직 같은 클래스 타입이 고정 된 경우에 비해 훨씬 더 많은 오버 헤드를 야기한다.

  • 직접 전화 (205) MS
  • 위의 함수 포인터 예를 들어 258 밀리
  • FunctionPointer 예 1049 MS
  • 표준 : 기능 3951 MS

모든 : 86 & GCC의 일부 벤치 마크 최적화 아이디어는 대단히 감사합니다!

+0

'FPointer'를 보면, 항상 객체가 있고 널 포인터 검사를 모두 신뢰하기 때문에 모든'c_callback'을 제거 할 수 있습니다. 여기서 말하는 것은 위에서 말한 "모든 유형의 안전이 창 밖으로 나옵니다"입니다. 컴파일러가 당신을 도울 수 없기 때문에 원하는대로 꾸밀 수 있습니다. – user4581301

+0

MBED 콜백 클래스가 좀 더 효율적으로이 작업을 수행하지만 매우 중요한 성능 차이는 없음을 알았습니다. 약 900ms에서 실행 테스트. 검사를 제거하면 몇 밀리 초가 절약됩니다. – TeroK