boost.program_optionsとboostのbuild
C++でコマンドラインから起動するプログラムを作っていると、やっぱり引数をパースしてくれるライブラリが欲しくなります。少し探したら、さすがboost。ありました。boost.program_optionsを使えばよいようです。

#include <boost/program_options.hpp>

namespace po = boost::program_options;

int main (int argc, char **argv) {
 
  po::options_description opt("options");
  opt.add_options()
    ("help,h","display this help")
    ("data,d",po::value<string>(),"data file")
    ("cls,c",po::value<string>(),"class file")
    ("trees,t",po::value<int>()->default_value(100000), "number of trees (default=100,000)")
    ("M,m", po::value<int>(), "m (default=sqrt(number of attributes)")
    ("prefix,p", po::value<string>(), "prefix of output files")
    ("attr_list,al", po::value<string>(), "list of attributes (file with no header)")
;
  po::variables_map vm;
  po::store(po::parse_command_line(argc, argv, opt), vm);
  po::notify(vm);

  string data_file;
  string cls_file;
  if( vm.count("help") || !vm.count("data") ){
    cout << opt << endl; // ヘルプ表示
    return 0;
  }else{
    //プログラムの実行のための準備
    data_file = vm["data"].as<string>();
    cls_file  = vm["cls"].as<string>();
  }
  //... 続く

なんとなく、見ればわかると思います。add_optionsで追加するとき、最初に書くのが正式名称で、カンマで区切って省略形です。実際に使うときは、--data=で指定するか、-d で指定するかですね。
プログラムの中でアクセスするときは、正式名称で。省略形は、1文字のみです。省略形では、スペースや=などを使わず続けて書くことが出来ます。

ただ、boost_optionsを使おうと思うと、boostをビルドする必要があります。
Unix系OSとCygwinでは簡単です。Windowsではいろいろ面倒がありそうですが・・・

boostを展開したディレクトリで、
./configure
make
make install
です。/usr/localなどにboostのヘッダファイルをインストールしている場合など、書き込み権限があるか確認してください。また、configureのオプションでインストール先を変更することも可能です。私は、MacOSでsudoつけただけですが。

~$ g++ -I /usr/local/include/boost-1_34_1/ ***.cpp /usr/local/lib/libboost_program_options.a

でコンパイル出来ます。コマンドライン引数のヘルプを半ば自動で生成してくれるので楽です。

options:
  -h [ --help ]                display this help
  -d [ --data ] arg            data file
  -c [ --cls ] arg             class file
  -t [ --trees ] arg (=100000) number of trees (default=100,000)
  -m [ --M ] arg               m (default=sqrt(number of attributes)
  -p [ --prefix ] arg          prefix of output files
  -a [ --attr_list ] arg       list of attributes (file with no header)

ちなみに、Pythonで似たようなことを実現してくれるモジュールに、getoptとoptparseモジュールがありますが、optparseの方が現代的(オブジェクト指向由来の発想)なので、後者のほうがいいでしょう。

スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

【2008/12/06 18:29】 | C++ | トラックバック(0) | コメント(0) | page top↑
<<MacでいろいろなPythonのバージョンをインストールする | ホーム | MaxOSX10.5.3(Leopard)でTeXをつかう>>
コメント
コメントの投稿














管理者にだけ表示を許可する

トラックバック
トラックバックURL
→http://tanopy.blog79.fc2.com/tb.php/32-38b8595d
この記事にトラックバックする(FC2ブログユーザー)
| ホーム |