параметры по умолчанию c++: можно ли оставить только последний аргумент(ы)?
Я знаю можно сделать что-то вроде:
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
Но это не работает .
Существует ли синтаксис для этого или это просто так это невозможно ?
4 ответа:
В качестве альтернативы от указания значений параметров по умолчанию можно использовать несколько перегрузок функций, таких как:
int foo(int a, int b){return a+b; } int foo(int b){return foo(0,b); } int foo(){return foo(0,1); }
Я знаю, что это не совсем ответ на ваш вопрос, но вы можете попробовать использовать boost named parameters. Это может быть полезно для вашего случая использования.
Напрямую это невозможно. Однако это возможно, если вы объявите структуру для входных параметров, которая инкапсулирует значения по умолчанию и имеет индивидуальные задатчики:
#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 }
Это, конечно, довольно накладные расходы. С другой стороны, имхо так или иначе имеет смысл довольно часто инкапсулировать параметры в структуру и предоставлять значения по умолчанию там, а не на объявлении функции.