私は '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 */
あるいはそれ以上のものを実現するにはどうしたらよいかということです。あるいは、なぜこれをやりたくないのか (つまり、私の精神的なパラダイムが悪い理由) を説明していただければ幸いです。
編集
による便利つまり、維持可能そして冗長性がない。
ベストアンサー1
指定初期化は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;
}
2021年アップデート
として@コード・ドッグ/std:c++latest
注記: Visual Studio 2019 を使用しているユーザーは、 の下にある「C++ 言語標準」フィールドを設定する必要がありますConfiguration Properties -> C/C++ -> Language
。