9

実行可能ファイルがあるとします (mac、win、および linux で実行)

 a.out [-a] [-b] [-r -i <file> -o <file> -t <double> -n <int> ]

の引数は、[ ]オプションであることを意味します。ただし、最後の引数-rが設定されている場合-i-o、、、、-tおよび-nも指定する必要があります。

コマンドライン引数を解析するための優れた C++ライブラリがたくさんあります。 simpleopt( http://code.jellycan.com/simpleopt/ )、boost.program_options ( http://www.boost.org/doc/libs/1_52_0/doc/html/program_options.html )など。これらの引数間の条件付き関係を直接エンコードできるものがあれば、エラー処理を手動でコーディングする必要はありません

if ( argR.isSet() && ( ! argI.isSet() || ! argO.isSet() || ... ) ) ...

を手動で設定します--help

ライブラリtclapでは、引数の XOR を使用できます。たとえば、 または のいずれ-a-bは許可されますが、両方は許可されません。したがって、その用語では、引数の AND が適切です。

それを行うことができる、用途が広く、軽量で、クロスプラットフォームのライブラリを知っている人はいますか?

4

4 に答える 4

2

引数を 2 回渡すことができます。がオプションにある場合-rは、パーサーをリセットし、新しい必須オプションを追加して最初からやり直します。


TCLAP がどのように機能するかを調べてXorHandler、独自の を作成することもできますAndHandler

于 2012-12-19T15:53:39.610 に答える
0

あなたが探しているエラー処理部分に合うように見えるコードのスニペットの一部がありTCLAPますが、あなたが探しているものと正確には一致しません:

# include "tclap/CmdLine.h"

namespace TCLAP {

class RequiredDependentArgException : public ArgException {
public:
  /**
   * Constructor.
   * \param text - The text of the exception.
   * \param parentArg - The text identifying the parent argument source
   * \param dependentArg - The text identifying the required dependent argument
   * of the exception.
   */
  RequiredDependentArgException(
    const TCLAP::Arg& parentArg,
    const TCLAP::Arg& requiredArg)
  : ArgException(
    std::string( "Required argument ") +
    requiredArg.toString() +
    std::string(" missing when the ") +
    parentArg.toString() +
    std::string(" flag is specified."),
    requiredArg.toString())
  { }
};

} // namespace TCLAP

そして、TCLAP::CmdLine::parse呼び出された後に新しい例外を利用します。

if (someArg.isSet() && !conditionallyRequiredArg.isSet()) {
  throw(TCLAP::RequiredDependentArgException(someArg, conditionallyRequiredArg));
}

このロジックを処理するクラスを拡張して追加することを検討したことを覚えていますが、実際に探していたのは適切なエラー レポートだけであることに気付きました。少なくとも、次にやってきた貧乏人に役立つような方法ではありません)。「A が true の場合、B を設定する必要がありますが、D の値が N の場合、C を設定することはできません。」このようなことをネイティブ C++ で表現することは、特に CLI 引数の解析時に非常に厳密な引数チェックを行う場合に適しています。

本当に病的なケースと要件については、Boost などを使用してステート マシンを作成します。MSM(マルチステート マシン)。HTH。

于 2013-01-21T06:50:44.653 に答える
0

-r が連続して 4 つの値を取るように、引数の構文を変更できます。

于 2012-12-19T15:54:55.800 に答える