1. ホーム
  2. c++

[解決済み] 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;
}

GCCデモ MSVCデモ

20201年のアップデート

として コード・ドゴ が指摘したように、Visual Studio 2019を使用している人は、以下のように設定する必要があります。 /std:c++latest   の下に含まれる "C++ 言語標準" フィールドのためのものです。 Configuration Properties -> C/C++ -> Language .