C++のコマンド引数解析

Boost.Program_optionsを使用したコマンドライン引数処理の紹介


基本の使い方

基本的な引数定義からパースまでの流れはoptions_descriptions定義 -> add_options()でオプション設定 -> parse & store & notifyで解析実行 -> variables_mapを介した結果取り出しとなります

#include <boost/format.hpp>
#include <boost/program_options.hpp>
#include <iostream>

using namespace std;
using namespace boost;
namespace po = boost::program_options;

int main(int argc, char** argv) {
  po::options_description desc("boost::program_options test");

  // オプション定義の追加
  desc.add_options()
    ("help,h", "Print this message")
    ("num,n", po::value<int>(), "Input number");

  po::variables_map vm;
  try {
    // コマンドライン引数の読み込み
    po::store(po::parse_command_line(argc, argv, desc), vm);
    po::notify(vm);
  } catch (po::error& e) {
    // 不明オプションが入力された場合エラーメッセージとヘルプを表示して終了
    cout << e.what() << endl;
    cout << desc << endl;
    return -1;
  }

  // オプション有無の判定
  if (vm.count("help")) {
    cout << desc << endl;
    return 0;
  }

  // オプション値の取り出し
  if (vm.count("num")) {
    cout << format("num option value is %d\n") % vm["num"].as<int>();
  }

  return 0;
}

オプションの定義

オプションはadd_options()で返されたオブジェクトの()オペレータを呼び出して追加します。type情報を指定することで引数の取る型やデフォルト値などを設定することが可能です

add_options().("オプション名", "説明")              // 引数を取らないオプション
add_options().("オプション名", "タイプ情報", "説明") // 引数を取るオプション

コンパイル方法

コンパイル時はリンカに-l boost_program_options-mtを指定する必要があります

% clang++ test.cc  -lboost_program_options-mt -o test

引数Typeの指定例

デフォルト値

  // デフォルト値の設定
  desc.add_options()
    ("max", po::value<int>()->default_value(100), "Set maximum value")
    ("min", po::value<int>()->default_value(1), "Set min value");

必須オプション指定

  // 必須オプション
  desc.add_options()
    ("must_num", po::value<int>()->required(), "Must number option");

配列オプション

引数型にstd::vectorを指定することで、オプション値を配列で取得することが可能です

  // 配列オプション
  desc.add_options()
    ("multi_num", po::value<vector<int>>(), "Multiple number option");

おすすめ