将std :: map中元素的位置作为参数传递给被调用函数

时间:2016-12-30 12:51:35

标签: c++ parameter-passing stdmap

说,我有两个功能:

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
}

我如何做到这一点?

2 个答案:

答案 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);
}

然后,您不会将methodAmethodB作为函数指针传递,而是传递methodAWrappermethodBWrapper

funcToAvoidRepeatedCode然后只需

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

这种方式funcToAvoidRepeatedCode仅包含公共代码,并且所有差异都被提取到辅助方法A和B中。(如果methodAmethodB没有其他用途,您甚至可以将它们内联到methodAWrappermethodBWrapper,因此函数的数量保持不变。)