默认参数:只能保留最后一个参数吗?
Default parameters: can only the last argument(s) be left?
我知道可以做类似的事情:
int foo(int a = 0, int b = 1) { return a + b; }
然后在没有默认参数的情况下使用它,例如:
foo(); // a = 0, b = 1 -> 1
或者最后一个作为默认值,例如:
foo(2); // a = 2 and b = 1 default -> 3
但是我的问题是:
是否可以对第一个参数(a)使用默认值并给出第二个参数(b)的值
我的第一个想法是这样做(这行不通!):
foo(,2); // a = 0 default and b = 2
是否存在语法
或者这是不可能的?
不,在当前语法中是不可能的。
我知道这不是您问题的真正答案,但您可以尝试使用 boost named parameters。它可能对您的用例有用。
除了指定默认参数值,您还可以使用多个函数重载,例如:
int foo(int a, int b){return a+b; }
int foo(int b){return foo(0,b); }
int foo(){return foo(0,1); }
直接是不可能的。但是,如果您为输入参数声明一个封装默认值并具有单独设置器的结构,则可能以某种方式:
#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
}
这当然是一笔不小的开销。另一方面,恕我直言,将参数封装到一个结构中并在那里而不是在函数声明中提供默认值是很有意义的。
一旦我们为参数提供了默认值,所有后续参数也必须具有默认值。例如,
// 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);
我知道可以做类似的事情:
int foo(int a = 0, int b = 1) { return a + b; }
然后在没有默认参数的情况下使用它,例如:
foo(); // a = 0, b = 1 -> 1
或者最后一个作为默认值,例如:
foo(2); // a = 2 and b = 1 default -> 3
但是我的问题是: 是否可以对第一个参数(a)使用默认值并给出第二个参数(b)的值
我的第一个想法是这样做(这行不通!):
foo(,2); // a = 0 default and b = 2
是否存在语法 或者这是不可能的?
不,在当前语法中是不可能的。
我知道这不是您问题的真正答案,但您可以尝试使用 boost named parameters。它可能对您的用例有用。
除了指定默认参数值,您还可以使用多个函数重载,例如:
int foo(int a, int b){return a+b; }
int foo(int b){return foo(0,b); }
int foo(){return foo(0,1); }
直接是不可能的。但是,如果您为输入参数声明一个封装默认值并具有单独设置器的结构,则可能以某种方式:
#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
}
这当然是一笔不小的开销。另一方面,恕我直言,将参数封装到一个结构中并在那里而不是在函数声明中提供默认值是很有意义的。
一旦我们为参数提供了默认值,所有后续参数也必须具有默认值。例如,
// 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);