我正在尝试调用一个重载函数,该函数对具有默认值参数的函数指针进行操作。
void originalFunction1 (int a = 0) {printf("I'm #1 and a is %d",a);}
void originalFunction2 () {printf("I'm #2");}
void overloadedFunction (void (*fptr)(void))
{
fptr();
}
void overloadedFunction (void (*fptr)(int))
{
overloadedFunction( (void(*)(void)) fptr);
}
int main()
{
overloadedFunction(originalFunction1);
overloadedFunction(originalFunction2);
// output is:
// I'm #1 an a is -1073743272
// I'm #2
}
正如this question的答案所指出的那样,默认值不是函数签名的一部分,也不能在(函数指针 - )参数定义期间重复。 正如我的示例所示,它们可以被抛弃以进行调用,但它们将不会被初始化为其默认值。
有什么方法可以解决这个问题吗?
我无法修改原始功能但我知道默认值。 我可以修改主重载函数以及重定向。 永远只会在没有参数的情况下调用fptr。 实际上,还有更多的重载函数,因为返回类型也不同,但我可以更容易地将其转换掉。
答案 0 :(得分:2)
简短的回答是否定的。演员是合法的,但唯一的 你可以做的结果是把它们扔回原始 类型。默认参数不会更改签名 功能。他们只在呼叫站点进行考虑,在那里 如果客户端没有提供参数,则传递它们。该 函数本身总是用完整的参数集来调用, 如果你通过结果调用它,它显然不会是 演员。
这里通常的答案,如果你控制了消息来源,那就是 使用重载而不是默认参数。 (我听说 你应该总是使用重载的参数而不是 默认参数。)所以
void originalFunction1( int a ) { ... }
void originalFunction1() { originalFunction1( 0 ); }
而不是你拥有的。
或者,您可以使用模板玩游戏:
template <typename FunctionPtr>
void overloadedFunction( FunctionPtr fptr )
{
fptr();
}
但是,如果可以使用它,我更喜欢第一种解决方案。