2016-12-30 66 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

是的,同意。我想保持我的问题简单,所以删除它。 –

相关问题