C++11の型推論

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

C++11では型推論という仕様が追加されている。これは従来のC++では行えなかった変数の型を関数あるいは計算式などからコンパイラが自動的に判別するというもので、うまく使えばこれまで長い記述を必要としたコードが簡潔にまとめられるようになる。

型推論の定義の仕方と注意点

型推論は、変数型の代わりに「auto」を使い、なおかつ定数や計算式、関数などの返り値などを使って定義することで指定できる。例えば以下のコードが挙げられる。

[code lang=”cpp”]#include <iostream>
#include <cstdlib>

int main() {
auto num = 10;
std::cout << num << std::endl;
return EXIT_SUCCESS;
}[/code]

この場合、numという変数が型推論という機能で10という数値が整数型になるため、numはint型になる。

型推論ではコンパイル時にautoの型を判別するため、以下のようなコードはnumの型がわからないためエラーになる。

[code lang=”cpp”]#include <iostream>
#include <cstdlib>

int main() {
auto num; // これではnumの型がわからずエラーになる
num = 10;
std::cout << num << std::endl;
return EXIT_SUCCESS;
}[/code]

従って、autoの宣言時は必ず何らかの方法で定義しなければならない。

型推論は使いどころがある

型推論はうまく使えば、これまで長い記述を必要としていたものが簡潔にまとめられるようになったといえる。例えば以下のコードがある。

[code lang=”cpp”]std::vector<std::string> vec;
for (vector<string>::iterator it=vec.begin(); it != vec.end(); ++it) {
… // 任意の処理
}[/code]

これはかなり非常に長い記述になるが、autoを使うことによって、以下のように簡潔にまとめられる。

[code lang=”cpp”]std::vector<std::string> vec;
for (auto it=vec.begin(); it != vec.end(); ++it) {
… // 任意の処理
}[/code]

このように、ここぞという時には是非とも型推論を使いたいものである。

最後に

今回はC++11で追加された型推論について説明したが、これによって記述が楽になる分、下手な使い方をすれば余計面倒なことになる可能性があるので、使いどころを見極めた上で使っていきたいものである。

タイトルとURLをコピーしました