パスワードを忘れた? アカウント作成
494205 journal

yhtの日記: boost.program_option~1

日記 by yht

シミュレーション等のコードを書いていると,オプションで実行時に与えたい パラメーターが徐々に増えていって、ファイルから読み込ませたくなるが、 手頃な(ライセンスや移植性等の点で)となると案外悩むところ。 一回書いてしまえば使いまわすだけなので、暇な時の悩みではあるが。

gcc-4.2でboostのコンパイル・インストールがどうも上手く出来ないので、 boost関係を調べていてBoost::program_optionsなるライブラリを見つけた (いつの間に入った!)ので、忘れないようにメモをば。

オリジナルはboost.orgのドキュメントなので、要参照。

例題
簡単の為 namespaceのaliasを

namespace po = boost::program_options;

として定義する。
最初の例は、二つしかないオプションを読み込むもの(全ソースはexample/first.cpp)。
最初に

#include<boost/program_options.hpp>
namespace po = boost::program_options;

として、後は必要に応じて

#include<iostream>
#include<iterator>>
using namespace std;

等といつもの通りに加える。

originalはtry-catchで例外処理をしているので、first.cppを見るとして、 簡単の為例外処理は省く。

まずサポートするオプションを宣言するため、

po::options_description desc("Allowed options");
desc.add_options()
    ("help","produce help message")
    ("compression",po::value<int>(),"set compression level");

と幾つかの変数を定義する。 可能なオプションの集合は options_descriptionクラスで定義される。 こいつのadd_options()メソッドが、()演算子を定義していて,()演算子が 実際にオプションの追加作業を担う。この例では、「help」という名のオプションは、 値がなく、「compression」というオプションはint型の値を持つ。

次にコマンドラインからの読み込みを

po::variables_map vm;
po::store(po::parse_command_line(argc,argv,desc),vm);
po::notify(vm);

により行う。 初めにvariables_mapクラスの変数を定義する。このクラスは任意の型のオプションを補完しておく為のものである。次に store,parse_command_line,notify函数によりvmにオプション(オプションの種類とその値)が格納されるであろう。

読み込んだらオプションを順番に評価していく。

if(vm.count("help")) {
  cout << desc << "\n";
  return 1;
}

if(vm.count("compression")) {
  cout << "Compression level was set to "
   << vm["compression"].as<int>() << ".\n";
} else {
  cout << "Compression level was not set.\n";
}

variables_mapクラスは、std::mapと同じように使う事が出来るが、 オプションの値は上記のようにasメソッドで取り出さなければならない点が異なる。

これにてオプションの評価が終わり、初期化等が始まるが、 このfirst.cppはオプションを読み込む例なので、読み込んだオプションを 表示して終了する。

コンパイルは

g++ -o first -O2 first.cpp -lboost_program_options
g++ -o first -O2 first.cpp -lboost_program_options-mt

等と,必要なライブラリをリンクする必要がある(実行環境はgcc-4.1.2,boost-1.33.1 on amd64)。後はいつもと同じ。

実行例は

%./first
Compression level was not set.
%./first --help
Allowed options:
  --help                produce help message
  --compression arg     set compression level

%./first --compression 15
Compression level was set to 15.
%

と、「--オプション名 値」でオプションを与える。 この続きは次の巻にあるべし。

typodupeerror

吾輩はリファレンスである。名前はまだ無い -- perlの中の人

読み込み中...