C++ 默认参数:只能保留最后一个参数吗?
我知道有可能做如下事情:C++ 默认参数:只能保留最后一个参数吗?,c++,default-parameters,C++,Default Parameters,我知道有可能做如下事情: 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)的值 我的第一个想法是像这样做(不起作用!): 是否存在此
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)的值
我的第一个想法是像这样做(不起作用!):
是否存在此语法
或者这是不可能的 不,这在当前语法中是不可能的。我知道这并不是你问题的答案,但你可以尝试使用。它可能对您的用例有用。或者,通过指定默认参数值,您可以使用多个函数重载,如:
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
}
#包括
结构Foo{
INTA,b;
Foo():a(0),b(1){};
Foo setA(intx){a=x;返回*this;}
Foo-setB(intx){b=x;返回*this;}
};
void foo(foo f=foo(){std::cout一旦我们为参数提供了默认值,所有后续参数也必须具有默认值。例如
// 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);
不,不能这样做。密切相关;@SergeyA在复制缓冲区中加载了错误的东西。我实际上想使用上面提到的。这是不可能的;默认参数必须是最右边的“我知道可以做某事。”是的,你的愤怒让你愤怒。哦,他不是在说西斯。我的坏。你对我有什么期望?我是一个黑暗绝地,不是一个协议机器人。我没有真正的用语。只是在学习的时候自己说了这个(我是绝对的C++新手)。但是你的链接看起来很有帮助!难道这不会像<代码> Foo一样的效果吗?(int b=1,int a=0){..}
?@UNKN57是的。但是与int foo(int a=0,int b=1)
不同的效果。由于不明确,您不能同时声明这两个参数。也许我的示例不是最好的。我想要的是使用第一个参数的默认值,并将参数值传递到右边(我现在知道这是不可能的)。@UNKN57可能是你的例子过于简单了。关于消除参数类型歧义,我的建议可能会有更多的变化。@UNKN57:我不清楚这怎么会不完全符合你的要求。如果你调用foo(2)
就好像你调用了foo(0,2)
。这不正是您在示例中试图做到的吗?
// 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);