自定义大括号初始值设定项

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() {}
};