Boost Program_options:複数の引数リストの解析
-
23-09-2019 - |
質問
複数の引数を正または負の値で渡したいと思います。それを解析することは可能ですか?
現在、次の初期化があります。
vector<int> IDlist;
namespace po = boost::program_options;
po::options_description commands("Allowed options");
commands.add_options()
("IDlist",po::value< vector<int> >(&IDlist)->multitoken(), "Which IDs to trace: ex. --IDlist=0 1 200 -2")
("help","print help")
;
そして、私は電話したい:
./test_ids.x --IDlist=0 1 200 -2
unknown option -2
したがって、Program_optionsは私が通過していると想定しています -2 別のオプションとして。
Negial Integer値を受け入れることができるようにプログラム_optionsを構成できますか?
Armanに感謝します。
編集:ところで、私はシンプルなパーサーでそれを解析していました
store(command_line_parser(argc, argv).options(commands).run(), vm);
, 、 しかし 解決 拡張されたものを使用することでした:
parse_command_line
解決
「-2」を試しましたか?
編集: 引用することはトリックではないようですが、コマンドラインスタイルの動作を変更します。
char* v[] = {"name","--IDlist=0","1","200","-2"};
int c = 5;
std::vector<int> IDlist;
namespace po = boost::program_options;
po::options_description commands("Allowed options");
commands.add_options()
("IDlist",po::value< std::vector<int> >(&IDlist)->multitoken(), "Which IDs to trace: ex. --IDlist=0 1 200 -2")
("help","print help")
;
po::variables_map vm;
po::store(parse_command_line(c, v, commands, po::command_line_style::unix_style ^ po::command_line_style::allow_short), vm);
po::notify(vm);
BOOST_FOREACH(int id, IDlist)
std::cout << id << std::endl;
他のヒント
ノート: これは、受け入れられているソリューションへの発言です。
短いオプションを無効にすることが重要です。上記の解決策によって提案されています クロフィ うまく機能しますが、たまたま使用する場合 positional_option_description
(たとえば、次のようなオプションを使用せずにパラメーターを解析する ls file.txt instead of ls --file=file.txt
)あなたはあなたのコードを使用してそれを行うために変換するのに苦労するかもしれません parse_command_line
.
ただし、短いオプションを無効にして、 basic_command_line_parser
このような:
交換
store(command_line_parser(argc, argv).options(commands).run(), vm);
と
store(command_line_parser(argc, argv).options(commands).style(
po::command_line_style::unix_style ^ po::command_line_style::allow_short
).run(), vm);
「2つの順方向スラッシュ」は、「今すぐ使用されているプロトコルが使用されているプロトコル」の一般的な短距離です。
「プロトコル相対URL」として最もよく知られている、それらの例のJSファイルのような要素 - http
またはhttps
コンテキストからロードされた場合に特に役立ちます。プロトコルの相対URLを使用することで、を実装しないでください。
if (window.location.protocol === 'http:') {
myResourceUrl = 'http://example.com/my-resource.js';
} else {
myResourceUrl = 'https://example.com/my-resource.js';
}
.
CodeBase全体のロジックの種類(もちろん、example.com
のサーバーはhttp
とhttps
の両方を介してリソースを提供することができます)。
著名な実世界の例はMagento eコマースエンジンです。パフォーマンス上の理由から、店舗のページはデフォルトで平野http
を使用していますが、チェックアウトはhttps
が有効になっています。
ハードコーディングされたリソース(すなわち、サイトのヘッダ内の宣伝バナー)は、非プロトコル相対URL(すなわちhttp://example.com/banner.jpg
)によって参照される場合、https
が有効になっているチェックアウトに到達する顧客は、かなり不親切なで迎えられることになる。
「このページには不安な要素があります」
プロンプト - 想像できるように、どの平均的なテクニカルサバイの担当者をオフにします。
前述のリソースが
//example.com/banner.jpg
を介して参照されている場合、ブラウザは適切なプロトコルの先頭を処理します。tl; DR:混在しているHTTP / HTTPS環境のわずかな可能性でさえ、コンテンツにサービスを提供するホストがHTTPとHTTPSの両方であると仮定して、リソースをロードするためのダブルスラッシュ/プロトコルの相対URLを使用するだけです。 。