我正在尝试找到一种方便的方法来初始化“pod”C++ 结构。现在,考虑以下结构:
struct FooBar {
int foo;
float bar;
};
// just to make all examples work in C and C++:
typedef struct FooBar FooBar;
如果我想方便地在 C 中初始化它(!),我可以简单地写:
/* A */ FooBar fb = { .foo = 12, .bar = 3.4 }; // illegal C++, legal C
请注意,我想明确避免使用以下符号,因为如果我将来更改结构中的 _任何内容_,我会觉得它会折断我的脖子:
/* B */ FooBar fb = { 12, 3.4 }; // legal C++, legal C, bad style?
为了在 C++ 中实现与 /* A */
示例相同(或至少相似),我必须实现一个烦人的构造函数:
FooBar::FooBar(int foo, float bar) : foo(foo), bar(bar) {}
// ->
/* C */ FooBar fb(12, 3.4);
这感觉多余和不必要。此外,它与 /* B */
示例一样糟糕,因为它没有明确说明哪个值属于哪个成员。
所以,我的问题基本上是如何在 C++ 中实现类似于 /* A */
或更好的东西?或者,我可以解释为什么我不应该这样做(即为什么我的心理范式不好)。
编辑
_方便_,我的意思是可 维护 和 _非冗余_。
原文由 bitmask 发布,翻译遵循 CC BY-SA 4.0 许可协议
c++2a 将支持指定初始化,但您不必等待,因为 GCC、Clang 和 MSVC 正式支持 它们。
GCC 演示
MSVC 演示
2021 年更新
正如 @Code Doggo 所 指出的,使用 Visual Studio 2019 的任何人都需要为
/std:c++latest
下包含的“C++ 语言标准”字段设置Configuration Properties -> C/C++ -> Language
。