2011-04-21 6 views
1

가능합니까? 그렇다면 구문을 올바로 볼 수없는 것 같습니다. (C++ 함수 포인터)C++ 함수 포인터

배경 비트. 아래 코드는이 게시물에 대해 단축되었습니다. 이 구현의 이유는 SWITCH/CASE 또는 IF/ELSEIF 문의 끝없는 목록을 피하기 위해서입니다. DECODER_FUNCTION_TABLE의 끝없는 목록이 있습니다 (아래 참조). 이 코드는 니모닉을 사용하여 다른 것을 의미하는 산업 표준을 다루며 수백 가지의 니모닉이 있습니다. 그래서 내 코드의이 부분은 특정 니모닉을 디코드하여 레코드의 다른 부분에서 코드를 전달하는 것입니다. 어쨌든 내 어려움은 클래스 외부의 구조에 멤버 함수 포인터를 유지하는 것입니다 ...

보세요.

(([DECODER_FUNCTION_TABLE[i]).*this.*pFn)(A); 
+0

체크 아웃이 답변에 내 대답에있어 도움이 되거 것입니다 몇 가지 간단한 예제를 썼다 : http://stackoverflow.com/questions/1915880/boostbind-boostfunction-pointers-to-overloaded-or-templated-member-function/1917145#1917145 – Paul

답변

5

당신이 무엇을의 (A 멤버 함수 포인터 전화 :

typedef struct _DECODER_FUNCTION_RECS 
{ 
    ISO_MNEMONIC_ID Mnemonic; 
    void (Database::*pFn)(Database::Rec *); 

}DECODER_FUNCTION_RECS; 


DECODER_FUNCTION_RECS DECODER_FUNCTION_TABLE[] = { 

    SFP, &Database::Decode_SFP, 
    KOG, &Database::Decode_KOG 
}; 


void Database::DecodedDescription(Rec *A) 
{ 

    int i = 0; 
    bool Found = false; 

    while(i < DECODER_FUNCTION_TABLE_COUNT && !Found) 
    { 
    if(DECODER_FUNCTION_TABLE[i].Mnemonic == A->Mnemonic) 
     Found = true; 
    else 
     i++; 
    } 

    if(Found) 
    (([DECODER_FUNCTION_TABLE[i]).*this.*pFn)(A); 

} 


void Database::Decode_SFP(Rec *A) 
{ 
    // do decode stuff on A 
} 

내가 해결하기 위해 노력하고있어 디테일이 라인이다) 나는 코드가 더 잘 설명 할 수 있습니다 생각 주위 DECODER_FUNCTION_TABLE[i].pFn을 괄호를 넣어 수

(this->*DECODER_FUNCTION_TABLE[i].pFn)(A); 

로)라고하지만, 멤버 액세스 연산자 .는 더 높은 우선 순위를 가지고 있어요 멤버 함수 연산자 ->*보다

+0

와우! 빨리 답변! & 절대적으로 정확한! 정말 고맙습니다. 설명 주셔서 감사합니다 ... 나는 함수 연산자보다 우선 순위가 높은 멤버 액세스 연산자를 망치고있었습니다. – Eric

+0

@ 에릭 : 빠름? 아뇨, 물어 본 지 8 분이 지났습니다. :) 아직 아무도 대답하지 못해 난처했다. ;) – Xeo