将默认值参数的函数指针上的参数丢弃吗?

时间:2013-02-14 08:34:37

标签: c++ function-pointers default-value overloading

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

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。 实际上,还有更多的重载函数,因为返回类型也不同,但我可以更容易地将其转换掉。

1 个答案:

答案 0 :(得分:2)

简短的回答是否定的。演员是合法的,但唯一的 你可以做的结果是把它们扔回原始 类型。默认参数不会更改签名 功能。他们只在呼叫站点进行考虑,在那里 如果客户端没有提供参数,则传递它们。该 函数本身总是用完整的参数集来调用, 如果你通过结果调用它,它显然不会是 演员。

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

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

而不是你拥有的。

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

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

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