Garbage Collection

塵も積もれば山

目次

Blog 利用状況

ニュース

C++とかC#とか数学ネタを投下していく予定です。

[その他のページ]
日々の四方山話を綴った日記出水の日記帳

書庫

日記カテゴリ

[言語]ぼくのかんがえた超構文

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#あたりはやってくれないかしら。

参照?可変長引数?多重定義??
アー聞こえない聞こえない。(∩゚д゚)

投稿日時 : 2008年8月8日 3:12

Feedback

# re: [言語]ぼくのかんがえた超構文 2008/08/08 9:45 シャノン

引数構造体が出来ると、こういうことも

foo( .y = 1.0f, .x = 0.0f, .color = 0x00ff00ff );

できないかなぁ。

# re: [言語]ぼくのかんがえた超構文 2008/08/08 11:14 アキラ

そこで Boost.Parameter

# re: [言語]ぼくのかんがえた超構文 2008/08/08 14:38 uskz

>structがメンバ関数を持てるってのが非常に抵抗があって、出来たらPOD型を保障するものであって欲しいのですが…。

念の為に書いておきますが,PODクラス型にpublicでnon-staticでnon-virtualなメンバ関数を追加してもPOD型ですよ.ユーザ定義のコンストラクタとかを持つとPOD型じゃ無くなりますけど.

タイトル
名前
Url
コメント