C++ 函数指针-无法更改函数签名,我的选项是什么?

C++ 函数指针-无法更改函数签名,我的选项是什么?,c++,function-pointers,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 tr

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

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;
}
bool DeleteValues(标准::向量和向量)
{
bool isElementDeleted=false;
如果(某些条件为真)
{
从vec中删除元素;
isElementDeleted=true;
}
else if(其他条件为真)
{
从vec中删除元素;
isElementDeleted=true;
}
返回isElementDeleted;
}
这将从输入向量中删除一些元素。关于为什么要删除元素,有各种各样的场景,它会在此函数中检查元素并删除元素。 如果某个内容被删除,则返回true,否则返回false

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

新的要求是,除此之外,我还应该能够得到它被删除的原因

既然我不能更改函数签名(这将导致代码的其他非相关部分发生大量更改),那么我的选项是什么

您实际上可以通过添加带有默认值的参数来更改函数签名。所有的旧代码仍然可以工作,因为额外的参数将具有默认值,而需要返回原因的新代码将向第二个(可选)参数传递某些内容

额外的可选参数应该是什么?可能是一个
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);
}
bool DeleteValuesWithReason(std::vector&vec,std::string&reason)
{
//此处编码,与前面相同,但设置原因
}
布尔删除值(标准::向量和向量)
{
字符串伪码;
返回DeleteValuesWithReason(向量,虚拟);
}
您实际上可以通过添加带有默认值的参数来更改函数签名。所有的旧代码仍然可以工作,因为额外的参数将具有默认值,而需要返回原因的新代码将向第二个(可选)参数传递某些内容

额外的可选参数应该是什么?可能是一个
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);
}
bool DeleteValuesWithReason(std::vector&vec,std::string&reason)
{
//此处编码,与前面相同,但设置原因
}
布尔删除值(标准::向量和向量)
{
字符串伪码;
返回DeleteValuesWithReason(向量,虚拟);
}

也许您可以在类(或您实际调用此调用的位置)中为“获取删除原因”创建一个方法,例如


或者,如果有一个基类,那么实际上可以重载子类上的函数签名

也许您可以在类中(或您实际调用此调用的位置)为“获取删除原因”创建一个方法,例如


或者,如果有一个基类,那么实际上可以重载子类上的函数签名

一个(非常难看的)选项是一个全局变量,用于保存原因。将函数更改为将原因写入全局,并将调用者更改为读取全局。如果程序是多线程的,那么全局必须是
thread\u local
(或
\u thread
),以便不同线程中的并发调用不会在写入同一变量时发生冲突。

一个(非常难看的)选项是一个全局变量,用于保存原因。将函数更改为将原因写入全局,并将调用者更改为读取全局。如果程序是多线程的,那么全局线程必须是
线程\u本地
(或
\u线程
),以便不同线程中的并发调用不会冲突写入同一变量。

您可以返回int,all int=0应将autocast设置为true


当这不可能时,可能会用一秒钟的时间重载函数,以获得int ptr或enum。此外,您可以返回int,all int=0应将autocast设置为true


当这不可能时,可能会用一秒钟的时间来重载函数,从而在输入
std::vector
one
int
中获得一个int ptr或enum。显示的函数最好是伪代码,因为它实际上不会从向量中删除任何内容。至少不是从调用方的角度来看(提示:使用引用)。您可以使用一些全局状态来…:-/@Jarod42 globals在输入
std::vector
one
int
中是一个no-no
push_-back
,具有删除值/代码。显示的函数最好是伪代码,因为它实际上不会从向量中删除任何内容。至少不是从调用方的角度来看(提示:使用引用)。您可以使用一些全局状态来…:-/@Jarod42 globals是一个no-noI,我希望在这个例程的调用点找到删除原因(正如您正确地说的那样是
std::string
)。按照您的建议创建第二个功能是否可行?如果我遗漏了什么,很抱歉。“这是通过其他函数中的指针调用调用的。”如果代码使用类型为
bool(*)(std::vector vec)
的函数指针,则添加默认参数将中断代码。另外,为类型为(非常量)
std::string&
的参数指定默认参数也很尴尬。@JonathanWakely,这就是我添加两个函数段落的原因。@onherocks因为您在某些地方有指向函数的指针,所以不能将变量与使用默认参数的单个函数一起使用。相反,我添加了一些代码t