全体表示

[ リスト ]

Boost:program_options

イメージ 1

boost::program_optionsの備忘録

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

// options_descriptionは、種類(共通、コンフィグ、非表示(他にあるのか?))で分ける
// コマンドライン共通
generic.add_options()
  ("version,v", "print version string")  // 1つめがオプション文字列。2つめは、その説明。
                         // "version,v"は、','で区切って省略形を指定
  ("help", "produce help message") // 閉じ括弧後、','付かないので注意
  ;

// コマンドラインと、コンフィグファイルで使用
int opt;
po::options_description config("Configuration");
config.add_options()
  ("optimization", po::value<int>(&opt)->default_value(10), // デフォルト血の設定。値は、optに入る
    "optimization level")
  ("include-path,I",
    po::value< vector<string> >()->composing(), // composing()は、コンフィグファイルと
                                 // コマンドラインとで合成させるよの意。
    "include path")
  ;

// コマンドラインで非表示にさせるもの
po::options_description hidden("Hidden options");
hidden.add_options()
  ("input-file", po::value< vector<string> >(), "input file") // 任意個受け取りたいものは、vector<T>で。
  ;

// 全て
po::options_description cmdline_options;
cmdline_options.add(generic).add(config).add(hidden);

// コンフィグファイルで使うもの
po::options_description config_file_options;
config_file_options.add(config).add(hidden);

// 表示させるのも
po::options_description visible("Allowed options");
visible.add(generic).add(config);

// オプション文字列無しで受け取れるもの(positionalという。つまるところ、書かれている位置が意味を持つ)
po::positional_options_description p;
p.add("input-file", -1); // -1とすることで、全てのpositionalオプションが、"input-file"であると解釈される(vector<string>に、ざくざく入っていく)

// argc, argvを解析し、vmに入れる
po::variables_map vm;
store(po::command_line_parser(ac, av).
   options(cmdline_options).positional(p).run(), vm); // positionalの指定を忘れずに。

// コンフィグファイルの読み込み
ifstream ifs("multiple_sources.cfg");
store(parse_config_file(ifs, config_file_options), vm);
notify(vm);

// 以上で解析完了。後は、vm.count("オプション文字列")でオプションが指定されているかどうか、
// vm["オプション文字列"].as<T>()で、受け取り出来る。
if (vm.count("help")) {
  cout << "Usage: " << av[0] << " [options] input-file\n"; // ↓だけでは足りないものを。(positionalの説明はここで)
  cout << visible << "\n";                    // visibleがオプションの説明を出してくれる
  return 0;
}

if (vm.count("input-file"))
{
  cout << "Input files are: "
    << vm["input-file"].as< vector<string> >() << "\n";
}

詳しくは、↓
http://www.boost.org/doc/html/program_options.html

--
追記:positional_option
例えば、
a.exe infile outfile
と、positional_optionを指定したい場合は
po::positional_options_description p;
p.add("input-file", 1);
p.add("output-file", 1);
の様にする。

多すぎるpositional_optionを渡した場合は
too many positional options
という文字列を持った例外が飛んでくる。

閉じる コメント(0)

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事