将函数指针上的参数与默认值参数一起丢弃是否有效
Will casting away the parameters on a function pointer with default value parameters work?
我试图调用一个重载函数,该函数对具有默认值参数的函数指针进行操作。
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();
}
不过,如果你能用的话,我更喜欢第一种解决方案。
相关文章:
- 如何将enable-if与模板参数和参数包一起使用
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 概念可以与模板模板参数一起使用吗?
- 为什么当我尝试将priority_queue与参数一起使用作为指向结构的指针时会弹出错误
- 标准::原子::compare_exchange与两个memory_order参数一起使用的真实示例
- 如何在 C++ 中将 typedef 与类初始值设定项参数一起使用?
- 我可以将"token pasting operator"与"const"模板参数一起使用吗?
- 哪个强制转换应与模板类参数一起使用,dynamic_cast或reinterpet_cast?
- 将 boost::function 与指向派生类的共享指针的参数一起使用
- 如何将 #ifndef 与宏参数一起使用
- 如何将初始值设定项与右值引用参数一起使用 // 为什么不能使用另一个 C 样式数组变量初始化 C 样式数组
- 将模板类与引用非类型模板参数一起使用时出现链接器错误
- 如何将QDebug()与QT中的两个参数一起使用
- 将函数与指针参数一起使用作为另一个函数的参数
- 是否可以在C++中将宏条件与模板参数一起使用
- 提升program_options解析选项和参数一起
- 在C++中,如何仅将长选项与必需参数一起使用
- 当通过引用指针将函数与参数一起使用时会发生什么
- 将typedef与构造函数参数一起使用
- 将函数指针上的参数与默认值参数一起丢弃是否有效