6

boost::program_options私は自分のアプリケーションにコマンド ライン解析インターフェイスを提供するために使用します。オプションを解析するように設定したいのですが、

using namespace boost::program_options;
options_description desc("Allowed options");
desc.add_options()
    ("help,h", "produce help message")
    ("version,v", "print the version number")
    ("include-path,I", value< vector<string> >(), "include path")
    ("input-file,i", value<string>(), "input file");

positional_options_description p;
p.add("input-file", 1);

variables_map vm;

parsed_options parsed = command_line_parser(ac, av).
options(desc).positional(p).run();
store(parsed, vm);
notify(vm);

最後の切り替え後のすべてのトークンがベクトルの形式で返されるように構成したいと思います。collect_unrecognizedBoost のドキュメントに記載されている例に従って使用してみましたが、入力ファイルに位置引数も使用しているため、いくつかの問題が発生しました。

基本的にはこのようにしたいと思います。私が持っている場合:

./program -i "inputfile.abc" argument1 argument2 argument3

値に格納inputfile.abcしてofを返し、未承諾の引数として返したいと思います。input-filevector<string>argument1argument2argument3

ただし、位置引数を使用できるようにしたいので、

./program "inputfile.abc" argument1 argument2 argument3

同じ結果が得られます。

これがすでに尋ねられている場合は申し訳ありませんが、助けてくれてありがとう.

4

1 に答える 1

5

このトリックを実行するコードを思いつきましたが、これはわずかな回避策です。つまり、私は位置句を削除し、認識されていないものの最初の引数を取ることに頼りました. うまく機能しているように見えますが、あまり柔軟ではありません。

using namespace boost::program_options;

options_description desc("Allowed options");
desc.add_options()
    ("help,h", "produce help message")
    ("version,v", "print the version number")
    ("include-path,I", value< vector<string> >(), "include path")
    ("input-file,i", value<string>(), "input file")
    ;

variables_map vm;
vector<string> additionalParameters;

parsed_options parsed = command_line_parser(ac, av).
    options(desc).allow_unregistered().run();
store(parsed, vm);
additionalParameters = collect_unrecognized(parsed.options, 
    include_positional);
notify(vm);

if (!vm.count("input-file"))
    if (additionalParameters.empty()) 
    {
        cerr << "error: No input file specified\n";
        return EXIT_FAILURE;
    } 
    else
    {
        inputFileName = additionalParameters[0];
        additionalParameters.erase(additionalParameters.begin());
    }
else
    inputFileName = vm["input-file"].as<string>();
于 2012-04-16T18:20:20.113 に答える