What is it, naokirin?

C++0xの機能 (型推論)

C++0xの機能。次は"Type inference"(型推論)。

コレ無かったんかい!って感じですよね。
私的にもこの構文があったら今までのプログラムもずいぶんとすっきりかけただろうに、と思うところがちらほら。

さて、この"Type inference"。2つのやり方が今回、C++0xでは追加されるようです。


まず1つはautoキーワードによる初期化による型推論

「へ〜、そんなキーワードが追加されたのか」と思った人もいるとは思います。残念、実はもともとあります。static、extern、registerといったキーワードがついていない状態で宣言された変数には全て、autoキーワードをつけたのと同じ機能がついているんです。つまり、動的変数を意味するキーワードだったわけですが。
省略して良いために、C/C++をやっていてもほとんど気にしないタイプのキーワードです。

ただし今回からはこの強力な機能、型推論が使えるようになるという利点が存在するようになります。
気にしないなんて言ってられなくなるわけです。


使い方としては簡単。
autoキーワードをつけて変数宣言をし、初期化を行う。

するとその初期化時の右辺の型によって、変数の型を推論してもらえるわけです。

例.

int x = 9;
double y = 1;

auto i = x; /* iはint型 */
auto j = y; /* jはdouble型 */


またもう1つ、別の方法で型推論を行う方法があります。
それがdecltypeを用いる方法です。

sizeof()と同じような使い方でdecltype()の括弧内に変数などを書くことでその変数の型と同じ型名を指定したことになります。これは例を見た方が早いでしょうか。

例.

int x;

decltype(x) y; /* yはxと同じ型(つまりint型) */


という風に書けます。

型推論ができるようになることで、メタプログラミングなどの支援にもなりますし、単純にイテレータを使ったfor文で

for(vector<int>::iterator it = v.begin(); it != v.end(); it++){
	/* 処理 */
}

と書いていたところを

for(auto it = v.begin(); it != v.end(); it++){
	/* 処理 */
}


と書けるようになるといった明快なコードを書け、かつコード量の削減ができるという利点があります。