说,我有两个功能:
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 :(得分:2)
我可能会遗漏某些内容,但您明显有某种情况表明您是应该使用methodA
还是methodB
。那么为什么不将这个条件传递给函数而避免完全使用函数指针。
void funcToAvoidRepeatedCode(condition)
{
if(condition)
{
methodA(...);
}
else
{
methodB(...);
}
}
如果可以传递某些签名的任意函数(例如sort()
中的比较器),则需要传递函数指针,但在这种情况下不需要它。
答案 1 :(得分: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);
}
然后,您不会将methodA
或methodB
作为函数指针传递,而是传递methodAWrapper
或methodBWrapper
。
funcToAvoidRepeatedCode
然后只需
void funcToAvoidRepeatedCode(funcPtr) {
...
funcPtr(it);
...
}
这种方式funcToAvoidRepeatedCode
仅包含公共代码,并且所有差异都被提取到辅助方法A和B中。(如果methodA
和methodB
没有其他用途,您甚至可以将它们内联到methodAWrapper
和methodBWrapper
,因此函数的数量保持不变。)