在以下情况下,我想显式更改结构的构造函数中的第二个参数。如果可以,怎么可能?
struct foo{
int x;
int y;
foo(int a=4, int b=6){
x=a;
y=b;
}
};
int main(){
foo *f = new foo();
cout<<f->x<<" "<<f->y<<endl;
//4 6
foo *g = new foo(3,4);
cout<<g->x<<" "<<g->y<<endl;
//3 4
foo *h = new foo(3);
cout<<h->x<<" "<<h->y<<endl;
//3 6
//Can something like this be
//done in C++, if I want
//to change the value of the
//second variable only
foo *k = new foo(b = 13);
return 0;
}
答案 0 :(得分:3)
有可能吗?
构造函数是不可能的。通常,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);
}
使用lambda的解决方案,无需修改现有类即可使用。以下符合您对foo
的定义:
auto make_foo_x4 = [](int b) {
return foo(4, b);
};
foo f = make_foo_y(4);
缺点是我们必须显式地重复默认值x
,因此,如果在类定义中更改了默认值,这可能会破坏假设。