2011-04-21 266 views
1

這可能嗎?如果是這樣,我似乎無法得到正確的語法。 (C++函數指針)C++函數指針

位的背景。下面的代碼縮短了這篇文章。這種實現的原因是爲了避免無數的SWITCH/CASE或IF/ELSEIF語句;並有一個DECODER_FUNCTION_TABLE的無盡列表(見下文)。此代碼涉及使用助記符表示不同事物的行業標準,並且有數百種這些助記符。因此,我的代碼的這一部分是解碼某些助記符從另一部分代碼傳遞給它,它通過傳入記錄進行循環......無論如何,我的難處在於將成員函數指針保存在類之外的結構中...

看一看。我認爲該代碼可以做一個更好的工作,解釋;)

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]).*this.*pFn)(A); 
+0

退房這個答案:http://stackoverflow.com/questions/1915880/boostbind-boostfunction-pointers-to-overloaded-or-templated-member-function/1917145#1917145 – Paul 2011-04-21 11:57:16

回答

5

你調用一個成員函數指針(那是什麼這就是所謂的)與

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

能幫括號周圍DECODER_FUNCTION_TABLE[i].pFn,但成員訪問運算.具有更高的優先級比成員職能運營商->*

+0

哇!快速回答! &絕對正確!非常感謝。也謝謝你的解釋......我搞砸了具有比函數操作符更高優先級的成員訪問操作符。 – Eric 2011-04-21 12:16:02

+0

@Eric:快?那,那是你問了8分鐘後。 :)我很難過,沒有人回答。 ;) – Xeo 2011-04-21 12:34:11