自定义大括号初始值设定项
Custom brace initializer
假设我有这个结构:
struct MyStruct {
int field1;
char *field2;
MyStruct(int a, char* b): field2(b) {
field1 = doStuff(a);
}
MyStruct(int a): MyStruct(a, nullptr) {}
~MyStruct();
}
据我所知,这不是聚合,因为我有一些构造函数。
我想要实现的是以自定义方式使用大括号初始值设定项,这意味着使用如下代码:
MyStruct x = { 1, "string" };
隐式调用正确的构造函数(在本例中为第一个构造函数)。
这有可能吗?
你快到了。 MyStruct x = { 1, "string" };
调用复制列表初始化。它将尝试使用 braced-init-list
提供的参数从可用的构造函数构造一个 MyStruct
您的问题是您的构造函数采用 char*
,而 "string"
是 const char[N]
,它可以衰减到 const char*
,而不是 char*
。所以做出改变
struct MyStruct {
int field1;
const char* field2;
MyStruct(int a, const char* b): field2(b) {
field1 = a;
}
MyStruct(int a): MyStruct(a, nullptr) {}
~MyStruct() {}
};
然后
MyStruct x = { 1, "string" };
会起作用的。如果你想让它更防弹一点,你可以将 field2
更改为 std::string
并使用
struct MyStruct {
int field1;
std::string field2;
MyStruct(int a, const std::string& b): field1(a), field2(b) {}
MyStruct(int a): MyStruct(a, "") {}
~MyStruct() {}
};
假设我有这个结构:
struct MyStruct {
int field1;
char *field2;
MyStruct(int a, char* b): field2(b) {
field1 = doStuff(a);
}
MyStruct(int a): MyStruct(a, nullptr) {}
~MyStruct();
}
据我所知,这不是聚合,因为我有一些构造函数。
我想要实现的是以自定义方式使用大括号初始值设定项,这意味着使用如下代码:
MyStruct x = { 1, "string" };
隐式调用正确的构造函数(在本例中为第一个构造函数)。
这有可能吗?
你快到了。 MyStruct x = { 1, "string" };
调用复制列表初始化。它将尝试使用 braced-init-list
MyStruct
您的问题是您的构造函数采用 char*
,而 "string"
是 const char[N]
,它可以衰减到 const char*
,而不是 char*
。所以做出改变
struct MyStruct {
int field1;
const char* field2;
MyStruct(int a, const char* b): field2(b) {
field1 = a;
}
MyStruct(int a): MyStruct(a, nullptr) {}
~MyStruct() {}
};
然后
MyStruct x = { 1, "string" };
会起作用的。如果你想让它更防弹一点,你可以将 field2
更改为 std::string
并使用
struct MyStruct {
int field1;
std::string field2;
MyStruct(int a, const std::string& b): field1(a), field2(b) {}
MyStruct(int a): MyStruct(a, "") {}
~MyStruct() {}
};