最終更新日時:
が更新

履歴 編集

コマンドラインオプションの定義/取得

Boost Program Options Libraryを用いるとプログラムの実行時に付けられる引数文字列について、一般的なオプションの仕組みの定義とその取得を容易に行える。

なお、Boost.ProgramOptionsを用いる場合はコンパイルの際にg++ -lboost_program_options source.cxxの様にしてバイナリーのライブラリーをリンクする必要がある点に注意。

インデックス

オプションを定義する

<boost/program_options.hpp>に定義されるboost::program_options名前空間に含まれるoptions_description型により、プログラムオプションを定義する。

#include <boost/program_options.hpp>

int main(const int ac, const char* const * const av)
{
  using namespace boost::program_options;

  // オプションの定義
  options_description description("おぷしょん");
  description.add_options()
    ("hoge,h", value<int>()->default_value(-100), "ほげほげおぷしょんの説明だよ")
    ("fuga,f", value<std::vector<unsigned>>()->multitoken(), "ふがふがおぷしょんの説明だよ")
    ("help,H", "へるぷ")
    ("version,v", "ばーじょん情報")
    ;
}

以上の例では、app -hoge 123 -fuga 1 2 4 8 16 32であるとか、app -h -10 -f 123 456 789であるとかapp -Hなどの様な利用法を想定したプログラムオプションを定義している。

また、hogeにはデフォルト値として -100fugaは複数要素のオプションとしてmultitoken()を定義している。

※定義しただけでは意味がありませんので、実際には「オプションの取得」と組み合わせて使います。

オプションを取得する

parse_command_line()関数を使用して、options_descriptionの定義に基づいてコマンドライン引数を解析し、その結果をvariables_mapオブジェクトに対して格納する事を定義する。notiry()関数を使用することで、実際にvariables_mapオブジェクトに解析されたプログラムオプションの結果が格納される。

#include <boost/program_options.hpp>

int main(const int ac, const char* const * const av)
{
  using namespace boost::program_options;

  // オプションの定義
  options_description description("おぷしょん");
  // (省略:「オプションの定義」を参照のこと)

  // オプションの取得
  variables_map vm;
  store(parse_command_line(ac, av, description), vm);
  notify(vm);

  // (a.) オプション help が存在すれば description をコマンドのヘルプとして出力する。
  if( vm.count("help") )
    std::cout << description << std::endl;

  // (b.) オプション hoge の取得( int 型)
  auto hoge = vm["hoge"].as<int>();

  // (c.) オプション fuga の取得 ( std::vector<unsigned> 型)
  auto fuga = vm["fuga"].as<std::vector<unsigned>>();
}

この例では、(a.)により実際に実行時にapp -Hとコマンドラインでオプションを定義すれば、 description を元にした一般的なプログラムオプションの表示が行われる。

(b.)と(c.)ではそれぞれapp -hoge -10app -fuga 123 456 789の様に定義されたプログラムオプションをそれぞれint型、std::vector<unsigned>型取得している。