函数指针 - 无法更改函数签名,我有哪些选择?

时间:2014-08-08 12:00:56

标签: c++ function-pointers

我有一个伪代码的示例函数

bool DeleteValues(std::vector<int>& vec)
{
    bool isElementDeleted = false;
    if(some condition is true)
    {
        delete element from vec;
        isElementDeleted = true;
    }
    else if(some other condition is true)
    {
        delete element from vec;
        isElementDeleted = true;
    }

    return isElementDeleted;
}

这会从输入向量中删除一些元素。关于为什么要删除元素并在此函数中检查它们并删除元素的方法有很多种。 如果删除了某些内容,则返回true,否则返回false。

这是通过其他函数中的指针调用来调用的。 这是所有遗留代码。

新要求是,此外我还应该能够了解它被删除的原因。

由于我无法更改功能签名(这会导致代码的其他非相关部分发生很多变化),我有哪些选择?

4 个答案:

答案 0 :(得分:3)

您实际上可以更改功能签名,方法是添加一个带默认值的参数。所有遗留代码仍然有效,因为额外参数将具有默认值,并且需要发回原因的新代码将传递给第二个(可选)参数。

额外的可选参数应该是什么?也许是std::string(或者更确切地说,是对一个的引用)?


您也可以通过编写第二个函数来解决这个问题,该函数实际上是在当前函数中完成的。这个新函数有两个参数,第一个函数(当前函数)只调用新函数。

这可能是

bool DeleteValuesWithReason(std::vector<int>& vec, std::string& reason)
{
    // Code here, same as before but sets reason
}

bool DeleteValues(std::vector<int>& vec)
{
    std::string dummy;
    return DeleteValuesWithReason(vec, dummy);
}

答案 1 :(得分:1)

一个(非常丑陋)选项是一个全局变量来保持原因。更改函数以将原因写入全局,并更改调用者以读取全局。如果程序是多线程的,则全局必须是thread_local(或__thread),以便不同线程中的并发调用不会与写入同一变量冲突。

答案 2 :(得分:0)

也许你可以为&#34;找到删除&#34;的原因。在类中(或实际调用此调用的地方),例如。

 std::string reasonforDeletion( pass some arguments that may 
have anything to do with the deletion)
{
// write to log file or throw a message why it's deleted. 
} 

或者如果有基类,你实际上可以重载子类的函数签名。

答案 3 :(得分:0)

你可以返回一个int,所有int!= 0应该使autocast为true。

如果无法做到这一点,可能会使用第二个函数重载该函数,此外还会获得int ptr或enum