c ++默认参数:只能留下最后一个参数吗?

时间:2016-10-03 18:34:21

标签: c++ default-parameters

我知道可能做类似的事情:

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

但这不起作用

是否存在此语法 或者这是不可能的?

5 个答案:

答案 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);