C++ では、C スタイルの初期化子は、コンパイル時に有効な初期化のみが実行されることを保証できるコンストラクターに置き換えられました (つまり、初期化後、オブジェクト メンバーは一貫しています)。
これは良い習慣ですが、例のように事前初期化が便利な場合があります。OOP は、抽象クラスまたは作成設計パターンによってこれを解決します。
私の意見では、この安全な方法を使用すると単純さが損なわれ、セキュリティのトレードオフが高くつく場合があります。単純なコードは保守性を維持するために洗練された設計を必要としないためです。
別の解決策として、ラムダを使用してマクロを定義し、C スタイルのように初期化を簡素化することをお勧めします。
struct address {
int street_no;
const char *street_name;
const char *city;
const char *prov;
const char *postal_code;
};
#define ADDRESS_OPEN [] { address _={};
#define ADDRESS_CLOSE ; return _; }()
#define ADDRESS(x) ADDRESS_OPEN x ADDRESS_CLOSE
ADDRESS マクロは次のように展開されます。
[] { address _={}; /* definition... */ ; return _; }()
ラムダを作成して呼び出します。マクロ パラメーターもコンマで区切られているため、初期化子を角かっこに入れて次のように呼び出す必要があります。
address temp_address = ADDRESS(( _.city = "Hamilton", _.prov = "Ontario" ));
一般化されたマクロ初期化子を書くこともできます
#define INIT_OPEN(type) [] { type _={};
#define INIT_CLOSE ; return _; }()
#define INIT(type,x) INIT_OPEN(type) x INIT_CLOSE
しかし、呼び出しは少し美しくありません
address temp_address = INIT(address,( _.city = "Hamilton", _.prov = "Ontario" ));
ただし、一般的な INIT マクロを使用して ADDRESS マクロを簡単に定義できます。
#define ADDRESS(x) INIT(address,x)