[解決済み] C++構造体の便利な初期化
2022-04-26 02:08:25
質問
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 */
の例では、どの値をどのメンバに渡すかを明示していないためです。
そこで質問なのですが、基本的にどうすれば
/* A */
またはそれ以上のものをC++で作ることができますか?
あるいは、なぜこれをやりたくないのか(つまり、なぜ私のメンタルパラダイムが悪いのか)の説明でも結構です。
EDIT
By 便利 という意味でもあります。 保守性 と 非冗長 .
どのように解決するのですか?
指定された初期化はc++2aでサポートされる予定ですが、待つ必要はないでしょう。 公式サポート GCC、Clang、MSVCによって。
#include <iostream>
#include <filesystem>
struct hello_world {
const char* hello;
const char* world;
};
int main ()
{
hello_world hw = {
.hello = "hello, ",
.world = "world!"
};
std::cout << hw.hello << hw.world << std::endl;
return 0;
}
20201年のアップデート
として
コード・ドゴ
が指摘したように、Visual Studio 2019を使用している人は、以下のように設定する必要があります。
/std:c++latest
の下に含まれる "C++ 言語標準" フィールドのためのものです。
Configuration Properties -> C/C++ -> Language
.
関連
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
-
[解決済み] C++の'struct'と'typedef struct'の違い?
-
[解決済み] .NETにおけるstructとclassの違いは何ですか?
-
[解決済み] 構造体のsizeofは、なぜ各メンバーのsizeofの合計と等しくないのですか?
-
[解決済み] 構造体変数をコンソールに表示するには?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] なぜクラスではなくストラクチャーを選ぶのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】C++の余分な資格エラー
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件