Возможно ли, если да, то как?
Это невозможно с помощью конструктора.В общем, c ++ не поддерживает аргументы именованных ключевых слов для функций, и невозможно пропустить аргументы, даже если они имеют значение по умолчанию, если вы хотите передать нестандартное значение после него.
Это будет возможнобез конструктора, использующего синтаксис инициализации списка, так как C ++ 20 использует назначенные инициализаторы, если вы используете инициализаторы членов по умолчанию:
struct foo{
int x = 4;
int y = 6;
};
int main(){
foo f {.y = 4};
}
Вы можете добиться чего-то подобного с диспетчеризацией тегов;Нет необходимости в будущем стандарте:
struct foo{
int x = 4;
int y = 6;
enum Xtag { Xinit };
enum Ytag { Yinit };
foo(int a, int b) : x(a), y(b) {}
foo(Xtag, int a) : x(a) {}
foo(Ytag, int b) : y(b) {}
};
int main(){
foo f(foo::Yinit, 4);
}
Решение, использующее лямбду, которое можно использовать без изменения существующего класса.Следующее работает с вашим определением foo
:
auto make_foo_x4 = [](int b) {
return foo(4, b);
};
foo f = make_foo_y(4);
Недостатком является то, что мы должны явно повторить значение по умолчанию x
, так что это может нарушить предположения, если значение по умолчанию изменяется в определении класса.