Cha*_*_99 6 c++ overloading function-pointers default-value
我正在尝试调用一个重载函数,该函数对具有默认值参数的函数指针进行操作.
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
}
Run Code Online (Sandbox Code Playgroud)
正如这个问题的答案所指出的,默认值不是函数签名的一部分,也不能在(函数指针 - )参数定义期间重复.正如我的示例所示,它们可以被抛弃用于调用,但它们将不会被初始化为其默认值.
有什么方法可以解决这个问题吗?
我无法修改原始功能,但我知道默认值.我可以修改主重载函数以及重定向.永远只会在没有参数的情况下调用fptr.实际上,有更多的重载函数,因为返回类型也不同,但我可以更容易地抛弃它.
最简洁的答案是不。强制转换是合法的,但您对结果唯一能做的就是将它们转换回原始类型。默认参数不会更改函数的签名。它们仅在调用站点输入,如果客户端不提供参数,它们就会被传递到调用站点。函数本身总是使用完整的参数集进行调用,如果您通过强制转换的结果调用它,则显然不会这样。
如果您可以控制源,通常的答案是使用重载而不是默认参数。(我听说过应该始终使用重载而不是默认参数的论点。)所以
void originalFunction1( int a ) { ... }
void originalFunction1() { originalFunction1( 0 ); }
Run Code Online (Sandbox Code Playgroud)
而不是你拥有的。
或者,您可以使用模板玩游戏:
template <typename FunctionPtr>
void overloadedFunction( FunctionPtr fptr )
{
fptr();
}
Run Code Online (Sandbox Code Playgroud)
不过,如果您可以使用第一个解决方案,我更喜欢它。
| 归档时间: |
|
| 查看次数: |
347 次 |
| 最近记录: |