2

プログラムの構成ファイルを渡すためにboost::program_optionsを使用しています。特に、いくつかのオプションのコマンド ライン オーバーライドをよく使用します。たとえば、2 つのオプション "opt1" と "opt2" を登録すると、次のようにプログラムを実行することでデフォルト値を正常にオーバーライドできます。

 myProgram.exe --opt1=option_value_1 --opt2=option_value_2

すべて問題ありませんが、プログラムを誤って次のように実行することがすでに数回ありました

 myProgram.exe --opt1=option_value_1 opt2=option_value_2

このような場合 (2 つのハイフンがない場合)、エラーはスローされません。実際、明らかにmyProgramを次のように実行できます

 myProgram.exe list of any unregistered and unknown values

それでも正しく動作します。少なくとも、予期せぬことが起こったという通知を受け取ることを期待しています。私の問題の解決策はありますか?

4

2 に答える 2

2

allow_unregistered()parse コマンドから削除する必要があります。コマンドは単に

po::store(parse_command_line(argc, argv, desc), vm);

不明なオプションに対して例外がスローされます。

http://www.boost.org/doc/libs/1_54_0/doc/html/program_options/howto.html#idp123440592

例外/エラーが必要な場合、オプションに「--」がない場合は、次のような追加のパーサーを作成する必要があります。

std::pair<std::string, std::string> fix_option(const std::string& value)
{
   std::string name = value;
   std::string val;
   std::string::size_type pos = name.find("=");
   if (pos != std::string::npos)
   {
      val = name.substr(pos + 1);
      name = name.substr(0, pos);
   }
   if (name.substr(0, 2) != "--")
   {
      throw std::logic_error(std::string("invalid command, no -- in command: ") + name);
   }
   return std::make_pair(name.substr(2), val);
}

コード例

結果:

./new --help=j

output: j

./new help=j

output: 
terminate called after throwing an instance of 'std::logic_error'
  what():  invalid command, no -- in command: help
于 2013-07-19T09:20:08.303 に答える