寻找一种简单的方法来重新初始化结构

Looking for an easy way to reinitialize a struct

本文关键字:方法 结构 初始化 简单 一种 寻找      更新时间:2023-10-16

我有一个名为CoolStruct的结构体:

struct CoolStruct
{
    int id;
    uint32 type;
    uint32 subtype;
    String name;
};

我也有一个这些结构体的向量:

std::vector<CoolStruct> coolVector;

我想创建一堆具有预定义值的结构体来push_back到这个coolVector中。我希望代码不会变得混乱和丑陋。我想保留这个符号:

CoolStruct t = {1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0, T("Parametric")};
coolVector.push_back(t);
CoolStruct t =  {2, EQData::EQ_EFFECT_TYPE_FILTER_LOW_PASS,EQData::EQ_FILTER_TYPE_FILTER_BUTTERWORTH_12DB, T("Low Pass")};
coolVector.push_back(t);

但当然这不起作用…不允许进行重新初始化。有没有其他的解决方案,使这尽可能可读?我能想到的唯一替代方法是手动设置结构体的每个参数:

t.id = whatever; t.type = somethingelse; t.subtype = thisisalotofcode; t.name = justtosetupthisvector;
coolVector.push_back(t);

如何:

CoolStruct t1 = {1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0, T("Parametric")};
coolVector.push_back(t1);
CoolStruct t2 = {2, EQData::EQ_EFFECT_TYPE_FILTER_LOW_PASS,EQData::EQ_FILTER_TYPE_FILTER_BUTTERWORTH_12DB, T("Low Pass")};
coolVector.push_back(t2);

在c++ 0x中,我认为你应该能够做到:

CoolStruct t;
t = {1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0, T("Parametric")};
coolVector.push_back(t);
t = {2, EQData::EQ_EFFECT_TYPE_FILTER_LOW_PASS,EQData::EQ_FILTER_TYPE_FILTER_BUTTERWORTH_12DB, T("Low Pass")};
coolVector.push_back(t);

甚至:

coolVector.push_back({1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0, T("Parametric")});
coolVector.push_back({2, EQData::EQ_EFFECT_TYPE_FILTER_LOW_PASS,EQData::EQ_FILTER_TYPE_FILTER_BUTTERWORTH_12DB, T("Low Pass")});

事实上,如果你真的想要更有创意(并且你不想保留任何先前的元素),你可以用下面的语法替换整个向量:

coolVector = {
   {1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0, T("Parametric")},
   {2, EQData::EQ_EFFECT_TYPE_FILTER_LOW_PASS,EQData::EQ_FILTER_TYPE_FILTER_BUTTERWORTH_12DB, T("Low Pass")}
};

如果您添加一个简单的构造函数:

struct CoolStruct
{
    CoolStruct(int id, uint32 type, uint32 subtype, String name) : id(id), type(type), subtype(subtype), name(name) {}
    int id;
    uint32 type;
    uint32 subtype;
    String name;
};

你可以这样做:

CoolVector.push_back(CoolStruct(1, EQData::EQ_EFFECT_TYPE_PARAMETRIC, 0, T("Parametric")));
CoolVector.push_back(CoolStruct(2, EQData::EQ_EFFECT_TYPE_FILTER_LOW_PASS,EQData::EQ_FILTER_TYPE_FILTER_BUTTERWORTH_12DB, T("Low Pass")));