読者です 読者をやめる 読者になる 読者になる

アールテクニカ地下ガレージ

アールテクニカ株式会社の製品開発・研究開発・日々の活動です

C++11をベターC++として使おう!

C++ C++11

Author

中村@アールテクニカ

アールテクニカの中村です。

基本はC言語の文法でコーディングし、C++のクラスやテンプレートなどの難しい機能は使わず、行単位のコメント、ブロック内の自由な位置で変数宣言、関数のデフォルト引数などC++の便利な機能だけを使うことを「ベターC」と言ったりします。
C++の新規格であるC++11では、ラムダ式やマルチスレッド、正規表現も標準化されていますが、それ以外にもコーディングを楽にするための機能がいくつも追加されています。"ベターC++"として使えそうな新機能のうちいくつかを使ってみましょう。

C++11とは

2011年8月12日にISOによって承認されたC++の規格です。
ラムダ式(クロージャ)やマルチスレッドの標準サポートなど大きな変更が加わっています。
C++11の前の規格は、2003年に規格化されたC++03となっています。

型推論

従来のC++では変数の型は必ず明示する必要がありました。
長いクラス名をnewする時や多重テンプレートの変数を定義するとき同じ型名を2度書く必要があり冗長でした。
また、外部ライブラリの戻り値などはヘッダファイルやドキュメントを見て戻り値の型を調べる必要がありました。

C++03以前

// 長いクラス名
MyLongLongNameClass obj = new MyLongLongNameClass();

// 多重テンプレート
std::vector<std::string> it = std::vector<std::string>.begin();

// 戻り値の型を調べる必要がある
external_namespace::dataformat data = external_namespace::func();


C++11では、変数の型をautoにすることで、コンパイラが型を推論してくれます。

C++11

auto obj = new MyClass();

auto it = std::vector<std::string>.begin();

auto data = external_namespace::func();

だいぶスッキリしましたね。

raw文字列リテラル

C++03までは、\や"はエスケープする必要がありました。
エスケープ箇所が多いと間違った文字列になってしまうことも。

// Windowsファイルパス
std::string path = "C:\\directory\\filename.txt"

// 正規表現中の\
std::string regex = "\\\\.\\\\r\\\\n";

// 文字列中に"がある
std::string str = "文字列の中に\"がある";

C++11では"(と)"の内側には\や"がエスケープ無しで書けます。

// Windowsファイルパス
std::string path = R"(C:\directory\filename.txt)"

// 正規表現中の\
std::string regex = R"(\\.*\\r\\n)";

// 文字列中に"がある
std::string str = "(文字列の中に"がある)";

C++11で標準化された正規表現を使うにはありがたい機能ですね。

範囲に基づく for ループ

他の言語で言うところのforeachです。
インデックスが不要なら簡潔に書けますね。

int sum = 0;
int array[5] = { 1, 2, 3, 4, 5 };
for (int x : array) {
    sum += 2;
}


この様にC++11の新機能を使うことでコーディングが楽になりますので積極的に使って行きましょう!

Author

中村@アールテクニカ

アールテクニカのSE兼プログラマ。Web系のサーバサイド・フロントエンドからスマホ・PCのネイティブアプリまでソフトウェア開発全般が守備範囲。最近はハードウェア開発にも興味あり。

スポンサーリンク