是否可以在c++中初始化结构,如下所示:
struct address {
int street_no;
char *street_name;
char *city;
char *prov;
char *postal_code;
};
address temp_address = { .city = "Hamilton", .prov = "Ontario" };
这里和这里的链接提到,这种样式只能在C中使用。如果是这样,为什么在c++中不能使用呢?是否有任何潜在的技术原因,为什么它不是在c++中实现的,或者使用这种风格是不好的做法。我喜欢使用这种初始化方式,因为我的结构体很大,而且这种样式可以让我清楚地了解分配给哪个成员的值。
请与我分享是否有其他方法可以达到同样的可读性。
在提出这个问题之前,我已参考以下连结:
C/ c++ for AIX
C结构初始化变量
c++中使用标记的静态结构初始化
c++ 11正确的结构初始化
我知道这个问题很老了,但我找到了另一种初始化的方法,使用constexpr和currying:
struct mp_struct_t {
public:
constexpr mp_struct_t(int member1) : mp_struct_t(member1, 0, 0) {}
constexpr mp_struct_t(int member1, int member2, int member3) : member1(member1), member2(member2), member3(member3) {}
constexpr mp_struct_t another_member(int member) { return {member1, member, member3}; }
constexpr mp_struct_t yet_another_one(int member) { return {member1, member2, member}; }
int member1, member2, member3;
};
static mp_struct_t a_struct = mp_struct_t{1}
.another_member(2)
.yet_another_one(3);
此方法也适用于全局静态变量,甚至是构造变量。
唯一的缺点是糟糕的可维护性:每次必须使用此方法使另一个成员可初始化时,所有成员初始化方法都必须更改。
受到这个非常简洁的答案的启发:(https://stackoverflow.com/a/49572324/4808079)
你可以使用lamba闭包:
// Nobody wants to remember the order of these things
struct SomeBigStruct {
int min = 1;
int mean = 3 ;
int mode = 5;
int max = 10;
string name;
string nickname;
... // the list goes on
}
.
class SomeClass {
static const inline SomeBigStruct voiceAmps = []{
ModulationTarget $ {};
$.min = 0;
$.nickname = "Bobby";
$.bloodtype = "O-";
return $;
}();
}
或者,如果你想要非常花哨的话
#define DesignatedInit(T, ...)\
[]{ T ${}; __VA_ARGS__; return $; }()
class SomeClass {
static const inline SomeBigStruct voiceAmps = DesignatedInit(
ModulationTarget,
$.min = 0,
$.nickname = "Bobby",
$.bloodtype = "O-",
);
}
这样做有一些缺点,主要与未初始化的成员有关。从链接的答案评论说,它编译有效,虽然我没有测试它。
总的来说,我认为这是一个很好的方法。