コマンド ライン プログラムのオプションの終わりを示す伝統的な方法は、オプションを使用すること--
です。これをオプションとして認識し、コマンドラインの残りの部分を位置引数として受け入れるように boost::program_options を取得するにはどうすればよいですか? 以下は機能しません。
namespace po = boost::program_options;
po::positional_options_description posOpts;
posOpts.add("keywords", 1);
posOpts.add("input", 1);
std::vector<std::string> final_args;
po::options_description desc("Allowed Options");
desc.add_options()
...
("", po::value< std::vector<std::string> >(&final_args)->multitoken(), "end of options")
...
;
po::command_line_parser(argc, argv).options(desc).positional(posOpts).run();
引数として与えた場合、 (予想どおり)foo bar
何も得られませんが、引数として与えた場合 (および が見つかると予想される場合) も得られます。ここでは、引数名として空の文字列を持つ長い引数であると想定しています。代わりに、引数名として短い引数として解釈されることになっている場合、どうすればそれを指定できますか? 引数の指定を から に変更しても、私が見る限り、結果には影響しません。final_args
-- foo bar
final_args[0] == "foo"
final_args[1] == "bar"
--
-
""
",-"
--
boost::program_options を正しく処理するにはどうすればよいですか?
編集:これは、Tim Sylvester が提案したことを行うための試みですextra_style_parser
:
std::vector<po::option> end_of_opts_parser(std::vector<std::string>& args) {
std::vector<po::option> result;
std::vector<std::string>::const_iterator i(args.begin());
if (i != args.end() && *i == "--") {
for (++i; i != args.end(); ++i) {
po::option opt;
opt.string_key = "pargs";
opt.original_tokens.push_back(*i);
result.push_back(opt);
}
args.clear();
}
return result;
}
"pargs"
次のようにオプションに追加されました。
("pargs", po::value< std::vector<std::string> >(&pargs), "positional arguments")
--
引数リストにa を指定してこれを実行すると、required_option
例外が発生します。po::option
(末尾の引数ごとに for を作成する代わりに、それらをすべてpo::option::original_tokens
1 つにまとめると、同様の結果が得られますpo::option
。)