我知道可能做类似的事情:
int foo(int a=0, int b=1){return a+b}
然后在没有默认参数的情况下使用它,例如:
foo(2,3)
或最后一个默认例如:
foo(2) // a=2 and b=1 default
但我的问题是: 是否可以使用第一个参数(a)的默认值并给出第二个参数(b)
的值我的第一个想法就是这样做:
foo(,2) // a=0 default and b=2
但这不起作用。
是否存在此语法 或者这是不可能的?
答案 0 :(得分:6)
不,目前的语法是不可能的。
答案 1 :(得分:3)
或者,从指定默认参数值开始,您可以使用多个函数重载,例如:
int foo(int a, int b){return a+b; }
int foo(int b){return foo(0,b); }
int foo(){return foo(0,1); }
答案 2 :(得分:0)
我知道这不是您问题的答案,但您可以尝试使用boost named parameters。它可能对您的用例很有用。
答案 3 :(得分:0)
不可能直接。但是,如果您为输入参数声明一个包含默认值并具有单独setter的结构,则可能会以某种方式:
#include <iostream>
struct Foo{
int a,b;
Foo() : a(0),b(1) {};
Foo setA(int x) { a=x; return *this;}
Foo setB(int x) { b=x; return *this;}
};
void foo(Foo f = Foo()){ std::cout << f.a << " " << f.b << std::endl; }
int main() {
foo(); // uses default values for a and b
foo(Foo().setA(3)); // uses default value for b
foo(Foo().setB(5)); // uses default value for a
}
这当然是一些开销。另一方面,无论如何,将参数封装到结构中并在那里提供默认值而不是函数声明时,无论如何都是有意义的。
答案 4 :(得分:0)
一旦我们为参数提供了默认值,所有后续参数也必须具有默认值。例如,
// Invalid
void add(int a, int b = 3, int c, int d);
// Invalid
void add(int a, int b = 3, int c, int d = 4);
// Valid
void add(int a, int c, int b = 3, int d = 4);