サーチ…


基本的な使用法

ブーストプログラムオプションは、コマンドライン引数を解析して処理するための簡単で安全な方法を提供します。

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

int main(int argc, char** argv) {
  namespace po = boost::program_options;

  po::variables_map vm;
  po::options_description desc("Allowed Options");

  // declare arguments
  desc.add_options()
    ("name", po::value<std::string>()->required(), "Type your name to be greeted!");

  // parse arguments and save them in the variable map (vm)
  po::store(po::parse_command_line(argc, argv, desc), vm);

  std::cout << "Hello " << vm["name"].as<std::string>() << std::endl;

  return 0;
}

コンパイルして実行する:

 $ g++ main.cpp -lboost_program_options && ./a.out --name Batman
Hello Batman

boost::program_options::options_descriptionオブジェクトを出力して、期待される引数の形式を出力することができます:

std::cout << desc << std::endl;

次のようになります:

Allowed Options:
  --name arg                Type your name to be greeted!

エラー処理

boost::program_options::notifyを使用すると、パラメータが渡されたときのエラーを報告できます

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

int main(int argc, char** argv) {
  namespace po = boost::program_options;

  po::variables_map vm;
  po::options_description desc("Allowed Options");

  // declare options
  desc.add_options()
    ("name", po::value<std::string>()->required(), "Type your name to be greeted!");

  // parse arguments
  po::store(po::parse_command_line(argc, argv, desc), vm);

  // check arguments
  try {
    po::notify(vm);
  } catch (std::exception& e) {
    std::cout << "Error: " << e.what() << std::endl;
    std::cout << desc << std::endl;
    return 1;
  }

  // program logic
  std::cout << "Hello " << vm["name"].as<std::string>() << std::endl;

  return 0;
}

不正な引数を渡すと役に立つエラーメッセージが表示される

 $ ./a.out
Error: the option '--name' is required but missing
Allowed Options:
  --name arg            Type your name to be greeted!

デフォルト値

デフォルト値のコマンドライン引数は簡単に指定できます:

// declare options
desc.add_options()
  ("name", po::value<std::string>()->required(), "Type your name to be greeted!")
  ("rank", po::value<std::string>()->default_value("Dark Knight"), "Your rank");

その値は変数マップにも追加されます。

  std::cout << "Hello " << vm["name"].as<std::string>() << " " << vm["rank"].as<std::string>() << std::endl;

説明にデフォルト値が表示されています...

$ ./a.out
Error: the option '--name' is required but missing
Allowed Options:
  --name arg                Type your name to be greeted!
  --rank arg (=Dark Knight) Your rank

...指定されていない場合に使用されます...

$ ./a.out --name Batman
Hello Batman Dark Knight

...しかし、コマンドラインで上書きすることができます:

 $ ./a.out --name Batman --rank FlyingSquirrel
Hello Batman FlyingSquirrel

スイッチ

スイッチは値をとらないコマンドライン引数です。次のように指定することができます。

desc.add_options()
  ("hidden", po::bool_switch()->default_value(false), "Hide your name");

そして一緒に使う:

if (vm["hidden"].as<bool>())
   std::cout << "Hello *****" << std::endl;

コマンドラインから:

 $ ./a.out --name Batman --hidden
Hello *****

説明では以下のように表示されます。

Allowed Options:
  --name arg                Type your name to be greeted!
  --rank arg (=Dark Knight) Your rank
  --hidden                  Hide your name


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow