C++の豆知識

ひさしぶりにC++を使ってみたら、いろいろな機能が増えていました。 Geant4のサンプルコードを読むときに知っておくとよさそうだと思ったことを整理しておきます。

スタイリングガイド

C++の変遷

C++

リリース年

ISO

C++98

1998

ISO/IEC 14882:1998

C++03

2003

ISO/IEC 14882:2003

C++11

2011

ISO/IEC 14882:2011

C++14

2014

ISO/IEC 14882:2014

C++17

2017

ISO/IEC 14882:2017

C++20

2020

ISO/IEC 14882:2020

C++23(予定)

2023

ISO/IEC 14882:2023

C++11以降を「モダンC++」と呼ぶそうです。 C++11で、ラムダ式やautoキーワードなど、大幅に機能が追加されました。 以前使っていたのはC++98/C++03だと思うので、どうりで機能が増えているはずです。

Geant4(v4.11.2)はC++17に対応しています。 Geant4のバージョンが対応しているC++などの情報は Geant4のバージョンに整理しました。

STL(Standard Template Library)

1#include <vector>  // std::vector
2#include <map>     // std::map
3#include <tuple>   // std::tuple
4// などなど

STLはC++98から標準ライブラリとして採用されているそうです。 大学院生のころ(2010年ころ)は、使い方がよく分からず避けてきましたが、いまなら使えそうな気がします。

一様初期化

1// 変数の初期化
2int x = 100;
3double y(3.14);
4char z = "z";
5
6// 変数の一様初期化
7int x{100};
8double y{3.14};
9char z{"z"};

C++11からインスタンスの初期化に{}(中括弧/波括弧)が使えるようになっていました。

1// 配列の初期化
2int array[] = {1, 2, 3, 4, 5};
3
4// 配列の一様初期化
5int array[]{1, 2, 3, 4, 5};

・・・なんで括弧の使い方を増やしてしまったんだと思いましたが、変数、配列・コンテナー、構造体、クラスなどを同じ書式で初期化できるのがメリットのようです。

1// コンテナーの初期化
2std::vector<int> vec;
3vec.push_back(1);
4vec.push_back(2);
5vec.push_back(3);
6
7// コンテナーの一様初期化
8std::vector<int> vec{1, 2, 3};

とくにstd::vectorの初期化が簡単に書けるようになっています。 また、型安全性も向上していて、モダンC++での使用が推奨されている初期化スタイルだそうです。

autoキーワード

1// 型を指定
2G4NistManager *nm = new G4NistManager::Instance();
3
4// 型を推論
5auto nm = G4NistManager::Instance();

autoは型推論で変数の型を指定するためのキーワードです。 使いたい型が分かりきっている場合や、返り値の型名が長い場合に使うと可読性が向上します。 Geant4はクラス名が長いものが多いため、どんどん使ってよいと思います。

ただし、すべてautoになってしまうと、逆に読みづらくなることもあるため、自分(やチーム)の中でルールを決めて使うのがよさそうです。

C++の参考サイト