2012-04-16 11 views
5

boost::program_optionsを使用して、アプリケーションにコマンドライン解析インターフェイスを提供します。私は最後のスイッチの後、すべてのトークンは、ベクターの形で返されるようにそれを設定したい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_unrecognizedを使用してみましたが、Boostのドキュメントで与えられていますが、入力ファイルの位置指定引数も使用しているため、いくつか問題が発生しました。

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

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

を私はそれがinput-file値でinputfile.abcを保存し、迷惑引数としてargument1argument2argument3vector<string>を返すようにしたいと思います。

./program "inputfile.abc" argument1 argument2 argument3 

は私に同じ結果を与えるように、しかし私はまた、位置引数を持ってできるようにしたいと思います。

ご迷惑をおかけして申し訳ございませんが、ご協力いただきありがとうございます。

答えて

3

私はトリックを行うコードを思いついたが、それはわずかな回避策である。つまり、私は位置句を削除し、認識されない句の最初の引数を取ることに頼った。それは正常に動作しているようだが、あまり柔軟ではありません。

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>(); 
関連する問題