6

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

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
}

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

有没有办法解决这个问题?

我无法修改原始函数,但我知道默认值。我可以修改主要的重载函数以及重定向。fptr 将始终只在没有参数的情况下被调用。实际上,有更多的重载函数,因为返回类型也不同,但我可以更容易地抛弃它。

4

1 回答 1

2

最简洁的答案是不。强制转换是合法的,但您唯一能对结果做的就是将它们转换回原始类型。默认参数不会更改函数的签名。它们只在调用站点考虑,如果客户端不提供参数,它们将被传递。函数本身总是用完整的参数集调用,如果你通过强制转换的结果调用它显然不会。

如果您可以控制源,这里通常的答案是使用重载而不是默认参数。(我听说你应该总是使用重载而不是默认参数。)所以

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

而不是你所拥有的。

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

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

但是,如果您可以使用它,我更喜欢第一个解决方案。

于 2013-02-14T08:54:50.510 回答