C言語のstructを初期化するにはこんな書き方をしていました。
struct Point{
float x, y, z;
int color;
};
struct Point pt[] = {
{0.0f, 0.0f, 0.0f, 0x00ffffff},
{1.0f, 0.0f, 0.0f, 0x00ff00ff},
{0.0f, 1.0f, 0.0f, 0x00ffff00},
{0.0f, 0.0f, 1.0f, 0x0000ffff},
};
C99ではこういう風にも書けます。
struct Point pt[] = {
{.color = 0x00ffffff, .x = 0.0f, .y = 0.0f, .z = 0.0f},
{.color = 0x00ff00ff, .x = 1.0f, .y = 0.0f, .z = 0.0f},
{.color = 0x00ffff00, .x = 0.0f, .y = 1.0f, .z = 0.0f},
{.color = 0x0000ffff, .x = 0.0f, .y = 0.0f, .z = 1.0f},
};
C++0xにもこの構文は取り入れられないようです。
C++ではコンストラクタを使って初期化しろ、ってことなのでしょう。
個人的に、structがメンバ関数を持てるってのが非常に抵抗があって、
出来たらPOD型を保障するものであって欲しいのですが…。
さて、CにしろC++にしろ、最初の構文に対する糖衣構文が用意されたわけです。
セミコロンで並べたものの順序に依存するってのは気持ち悪いんでしょうか。
そのくせ、コンストラクタを使った場合、これも並び順で決定されるわけですが、
セミコロンはダメでもカンマはOKというダブルスタンダードがありそうです。
ってな事を考えていたら脳内でミックスされますた。
// 関数を宣言すると…
int foo(float x, float y, float z, int color);
// 引数を構造体にしたものが自動的に宣言される
struct foo.param{
float x;
float y;
float z;
int color;
};
void sample(){
//引数構造体(仮)を使えば…
foo.param prm
prm.x = prm.y = prm.z = 0.0f;
prm.color = 0x00ffffff;
// こういう呼び出しも可能
foo(prm);
}
//委譲も簡単に!
int hoo(foo.param p){ foo(p);}
C++は無理でもC#あたりはやってくれないかしら。
参照?可変長引数?多重定義??
アー聞こえない聞こえない。(∩゚д゚)