将函数指针上的参数与默认值参数一起丢弃是否有效

Will casting away the parameters on a function pointer with default value parameters work?

本文关键字:参数 一起 有效 是否 默认值 函数 指针      更新时间:2023-10-16

我试图调用一个重载函数,该函数对具有默认值参数的函数指针进行操作。

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
}

正如这个问题的答案所指出的,默认值不是函数签名的一部分,在(函数指针-)参数定义过程中也不能重复。正如我的示例所示,它们可以在调用时被丢弃,但不会初始化为默认值。

有什么办法解决这个问题吗?

我无法修改原始函数,但我知道默认值。我可以修改主重载函数以及重定向。fptr总是只在没有参数的情况下调用。事实上,由于返回类型的不同,有更多的重载函数,但我可以更容易地将其丢弃。

简短的答案是否定的。强制转换是合法的,但唯一的是你可以对结果做的是把它们投射回原始类型默认参数不会更改作用他们只在呼叫站点登录如果客户端没有提供参数,则会传递它们。这个函数本身总是用全套参数调用,如果你通过演员阵容。

如果你能控制消息来源,通常的答案是使用重载而不是默认参数。(我听说了应该始终使用重载而不是默认参数。)所以

void originalFunction1( int a ) { ... }
void originalFunction1() { originalFunction1( 0 ); }

而不是你所拥有的。

或者,您可以使用模板玩游戏:

template <typename FunctionPtr>
void overloadedFunction( FunctionPtr fptr )
{
    fptr();
}

不过,如果你能用的话,我更喜欢第一种解决方案。