我相信这里已经有答案了,但是搜索一直返回PHP, c#和Java。我是专门问c++的。
如果我有一个函数,它有五个参数,它们都有默认值,但是我想显式地调用它,给第三个参数一个值,我传递什么给第一个和第二个参数?(我知道func(,,"Third")
不起作用,func(thirdArg:"Third")
也不起作用)
在c++中,你必须指定所有的参数到默认值,所以它必须是func("First","Second","Third")
。
c++还要求你在参数列表的"末尾"有默认值,所以你不能做像func(defaulted, not-defaulted)
您可以为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);
}
这可不是小事。也许你可以尝试boost参数。你可以这样传递参数
func(third_="third")
Please check =>
http://www.boost.org/doc/libs/1_56_0/libs/parameter/doc/html/index.html named-function-parameters
语言中没有直接支持。然而,c++程序员经常使用的一种习惯用法是命名参数(Named Parameter)习惯用法,以代替缺少类似bash的位置参数。
假设你的函数是类的成员方法,你可以很容易地应用这个习惯用法:
基本上,您有方法(可能是访问器)来修改对象的状态。每个方法返回一个对this
的非const引用,允许方法链接。
例子:
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
}