C++中默认值取决于其他输入参数

C++中默认值取决于其他输入参数,c++,default-value,C++,Default Value,在声明中似乎不可能出现这样的情况: void func(float a, int b=int(a+1)){/*do stuff*/} void func(float a, int b) { // Do stuff... } void func(float a) { func(a, (int)a + 1); } 基本上,我想要b的默认值取决于a。除了重载func之外,还有什么解决方法吗?重载:一个函数只取一个作为参数,然后调用另一个传递两个参数的函数 差不多 void fun

在声明中似乎不可能出现这样的情况:

void func(float a, int b=int(a+1)){/*do stuff*/}
void func(float a, int b)
{
    // Do stuff...
}

void func(float a)
{
    func(a, (int)a + 1);
}

基本上,我想要b的默认值取决于a。除了重载func之外,还有什么解决方法吗?

重载:一个函数只取一个作为参数,然后调用另一个传递两个参数的函数

差不多

void func(float a, int b)
{
    // Do stuff...
}

void func(float a)
{
    func(a, static_cast<int>(a) + 1);
}

重载:一个函数只取一个作为参数,然后调用另一个传递两个参数的函数

差不多

void func(float a, int b)
{
    // Do stuff...
}

void func(float a)
{
    func(a, static_cast<int>(a) + 1);
}

您可以实现@tobi303提到的内容。但是,如果确实需要两个单独的变量,还可以实现以下功能:

void func(float a)
{
    int b = (int)a + 1;
    // Do stuff...
}
过载也是可能的:

void func(float a, int b=int(a+1)){/*do stuff*/}
void func(float a, int b)
{
    // Do stuff...
}

void func(float a)
{
    func(a, (int)a + 1);
}

您可以实现@tobi303提到的内容。但是,如果确实需要两个单独的变量,还可以实现以下功能:

void func(float a)
{
    int b = (int)a + 1;
    // Do stuff...
}
过载也是可能的:

void func(float a, int b=int(a+1)){/*do stuff*/}
void func(float a, int b)
{
    // Do stuff...
}

void func(float a)
{
    func(a, (int)a + 1);
}

我想用funca调用它,然后应该指定默认值,或者用funca,b调用它。为什么不需要重载?这就像void funcfloat a{funca,a+1;}@tobi303一样简单,我也这么认为,这是一个重载。另一个选项可能是将一些无效的默认值分配给b,然后在函数中检查它,并将一些所需的值重新分配给bb@Satus什么是无效的默认值?您如何确保对于某些调用方,该值不是他希望传递的有效值?我希望使用funca调用它,然后应指定默认值,或者使用funca,b调用它。为什么不希望重载?这就像void funcfloat a{funca,a+1;}@tobi303一样简单,我也这么认为,这是一个重载。另一个选项可能是将一些无效的默认值分配给b,然后在函数中检查它,并将一些所需的值重新分配给bb@Satus什么是无效的默认值?如何确保某个调用方希望传递的值不是有效值?能否告诉我为什么使用static_casta+1?简单地使用INTA+1也可以,对吗?将浮点a转换为int@AnandSC样式转换可能是危险的,使用将让编译器检查转换是否可行。在这样一个简单的情况下,这并不重要,但使用而不是C样式转换或函数样式转换(例如inta everywhere)是一个好习惯,好习惯应该在任何地方保持,否则它就不再是一个习惯了。@JoachimPileborg我会记住这一点-非常感谢!你能告诉我你为什么使用static_casta+1吗?简单地使用INTA+1也可以,对吗?将浮点a转换为int@AnandSC样式转换可能是危险的,使用将让编译器检查转换是否可行。在这样一个简单的情况下,这并不重要,但使用而不是C样式转换或函数样式转换(例如inta everywhere)是一个好习惯,好习惯应该在任何地方保持,否则它就不再是一个习惯了。@JoachimPileborg我会记住这一点-非常感谢!