とりあえず、何か CUI アプリケーションなり複雑な C++ プログラムを書くとき、私にとって標準ライブラリに足りないものとして

  • ロガー
  • コマンド引数パーサ
  • テストライブラリ

以上の主に3つがあります。それらで最近よく使うイカしたヘッダオンリライブラリがあるので紹介します。ヘッダオンリライブラリを使う理由は、ヘッダオンリライブラリを作るとき手軽に内包できるからです (もちろんヘッダオンリじゃなくても)。

ロガー : Easylogging++

https://github.com/easylogging/easyloggingpp

たぶんヘッダオンリでなければ glog あたりが有名ですが、たぶんもっと高機能です。クロスプラットフォームでスレッドセーフです。GCC限定なら Stacktrace も吐けてテスト・デバッグ用途にも便利ですね。コンパイルが結構遅くなるのが欠点。

コマンド引数パーサ : cmdline

https://github.com/tanakh/cmdline

とても手軽かつミニマム、コード自体が読める規模なので弄りやすいライブラリで重宝します。ヘルプとかデフォルト値とか簡単にかけるのでとりあえずこれ書いてから始めるっていう。std::string readable_typename<T>()はデバッグで便利。

テストライブラリ : Catch

https://github.com/philsquared/Catch

前は全然ドキュメントが整備されてなかったけど、今見たら充実してたので色々紹介する手間が省けました。これも少しコンパイルが遅い。1 ファイルに#defineマクロと#include <catch.hpp>して、それを使えば良いよって書いてある (docs)。プリプロセスがかなり時間食うらしい。もう Boost 使うぞってプロジェクトなら Boost の minimaltest をよく使います。

プリコンパイル済みヘッダ作成ツール : cotire

https://github.com/sakra/cotire

最後にこうして C++ のヘッダオンリライブラリ作る上でコンパイル時間は死活問題なのでプリコンパイル済みヘッダ(PCH)の作成が必須です。IDEを使うなら多分何かオプションがあると思います。IDEを使う人も configure とか配布の際や CTest を使った TDD とか楽で CMake 便利です。そんなわけで CMake で使える cotire 重宝してます。

PCH で実際早くなるかはライブラリ次第なんですが、Expression Template とかあんまし早くならなさそうな Boost::Spirit 使ったプロジェクトでも 1/3 にビルド時間短縮されました。以下のページもとりあえず使ってみたい人には有用です。

CMake: プリコンパイル済みヘッダーの作成と利用