2016-12-30 68 views
0

說,我有兩個功能:通過元件的位置的std ::地圖作爲參數來調用函數

int methodA(int); 
int methodB(int); 

爲了避免下面的代碼大塊我想創建一個單獨的函數在給定的重複(比如,funcToAvoidRepeatedCode),這需要函數指針:

{ 
    //...many lines of code 

    std::multimap< size_t, std::pair<char, size_t> >::iterator it; 

    //...many lines of code 

    methodA(it->first); OR methodB(it->second.second); // << This is the only difference. 

    //...many lines of code 
} 

我知道如何通過使用std::function函數指針。我期待將以上代碼行更改爲以下格式:

void funcToAvoidRepeatedCode(funcPtr, ?????){ 

    //...many lines of code 

    std::multimap< size_t, std::pair<timelineWeakRef, size_t> >::iterator it; 

    //...many lines of code 

    funcPtr(???????); 
       ^~~~~~What kind of parameter I can pass to 
         funcToAvoidRepeatedCode() to differentiate the           
         position (first or second.second) in map element? 

    //...many lines of code 
} 

我該如何做到這一點?

+0

請澄清應該觸發'methodA'的條件是什麼,以及何時應該調用'methodB' –

+0

這個大代碼是兩個'switch-case'的一部分。所以,我試圖讓它們簡潔。請注意,還有其他'switch-case's以及不使用此代碼。所以我不能在'switch'之前或之後放置它,因爲它在所有情況下都不常見。 –

+0

是的,但它不是很清楚**當你希望'methodA'被調用和**時**'methodB' –

回答

2

我可能會缺少的東西,但你顯然有某種情況,表明你是否應該使用methodAmethodB。那麼爲什麼你不把這個條件傳遞給函數,而是完全避免使用函數指針。

void funcToAvoidRepeatedCode(condition) 
{ 
    if(condition) 
    { 
     methodA(...); 
    } 
    else 
    { 
     methodB(...); 
    } 
} 

傳遞函數指針將被要求如果某些簽名的任意功能可以被傳遞(例如,在sort()比較器),但在這種情況下,不需要它。

1

根據給出的信息,有一個簡單的方法來實現這一點:編寫另一套包裝函數。

int methodAWrapper(std::multimap< size_t, std::pair<char, size_t> >::iterator it) { 
    return methodA(it->first); 
} 

int methodBWrapper(std::multimap< size_t, std::pair<char, size_t> >::iterator it) { 
    return methodB(it->second.second); 
} 

然後強似methodAmethodB作爲函數指針,你傳遞methodAWrappermethodBWrapper

funcToAvoidRepeatedCode後來乾脆不

void funcToAvoidRepeatedCode(funcPtr) { 
    ... 
    funcPtr(it); 
    ... 
} 

這樣funcToAvoidRepeatedCode只包含了常見的代碼和所有的差異都提取到的輔助方法A和B(如果存在的methodAmethodB沒有其他用途,你甚至可以內聯他們到methodAWrappermethodBWrapper,所以功能的數量保持不變。)

+0

嗯......良好的解決方法。但是如果在其他一些地方,我該如何直接傳遞整數值**,比如'funcPtr(10)'。不幸的是,你的解決方案會殺死那種可能:(Upvoted。非常感謝。 –

+0

@SauravSahu是的,但這不是問題的一部分。 – melpomene

+0

是的,同意。我想保持我的問題簡單,所以刪除它。 –

相關問題