自定义支撑初始化器

时间:2017-08-09 17:31:56

标签: c++ uniform-initialization list-initialization

假设我有这个结构:

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" };

隐式调用正确的构造函数(在本例中为第一个)。

这有可能吗?

1 个答案:

答案 0 :(得分:7)

你快到了。 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() {}
};