我确定这已经在这里得到了回答,但是搜索不断返回 PHP、C# 和 Java。我特别问的是C++。
如果我有一个接受五个参数的函数并且它们都有默认值,但我想显式调用它并为第三个参数提供一个值,那么我应该为第一个和第二个参数传递什么?(我知道func(,,"Third")
不起作用,也没有func(thirdArg:"Third")
)
我确定这已经在这里得到了回答,但是搜索不断返回 PHP、C# 和 Java。我特别问的是C++。
如果我有一个接受五个参数的函数并且它们都有默认值,但我想显式调用它并为第三个参数提供一个值,那么我应该为第一个和第二个参数传递什么?(我知道func(,,"Third")
不起作用,也没有func(thirdArg:"Third")
)
在 C++ 中,您必须指定所有参数直到默认值,所以它必须是func("First","Second","Third")
.
C++ 还要求您在参数列表的“末尾”有默认值,因此您不能执行类似的操作func(defaulted, not-defaulted)
这两个规则都与 C++ 重载决议规则相关联。
您可以对 Java 构造函数中的默认参数的解决方案进行类似的处理。
但我不认为这在 C++ 中是一个好习惯,尤其是对于函数,因为上面怎么说 - 在非默认参数之后通常接受的默认参数的位置。
使用函数重载实现的解决方案:
void Foo(int default, int nodefault){
...
}
void Foo(int nodefault){
Foo(10, nodefault); //10 - is default option
}
int main(){
Foo(3); //calls Foo(10, 3);
}
该语言没有直接支持。然而,C++ 程序员经常使用的一个习惯用法来替代缺少类似 bash 的位置参数是命名参数习惯用法。.
假设你的函数是一个类的成员方法,你可以很容易地应用这个习惯用法:
基本上,您有方法(可能是访问器)来修改对象的状态。每个方法都返回一个对 的非常量引用this
,从而允许方法链接。
例子:
class Person{
public:
Person& setAge(int agep) { age = agep ; return *this; }
Person& setWeight(double weightp) { weight = weightp ; return *this; }
Person& setName(const std::string& namep) { name = namep ; return *this; }
private:
int age = 0;
double weight = 0.0;
std::string name;
};
int main(){
Person p;
p.setAge(42).setName("Kurt"); // set age and name, but not weight
}
这不是微不足道的。可能你可以试试 boost 参数。你可以这样传递参数,
func(third_="third")
请检查 =>
http://www.boost.org/doc/libs/1_56_0/libs/parameter/doc/html/index.html#named-function-parameters