2

ブースト v1.45.0 プログラム オプションを使用する Visual Studio 2008 C++ アプリケーションがあります。

次のようなコマンド ライン オプションを解析できるようにしたいと考えています。値 [1, 2, 4, 5, 6, 7] をfoo.exe -x 1,2, 4-7生成します。std::vector< int >だから、私はカスタムバリデータを書きました:

typedef std::vector< int > IDList;

void validate( boost::any& v, const std::vector< std::string >& tokens, IDList*, int )
{
    // Never gets here
}

int _tmain( int argc, _TCHAR* argv[] )
{
    IDList test_case_ids;

    po::options_description desc( "Foo options" );
    desc.add_options()
        ("id,x", po::value< IDList >(), "Specify a single ID or a range of IDs as shown in the following command line: foo.exe -x10,12, 15-20")
    ;

    po::variables_map vm;

    try
    {
        po::store( po::parse_command_line( argc, argv, desc ), vm );
        po::notify( vm );
    }
    catch( const std::exception& e)
    {
        std::cerr << e.what() << std::endl;
        std::cout << desc << std::endl;
        return 1;
    }

    return 0;
}

しかし、カスタム バリデータ コードに到達することはありません。私はいつもparse_command_lineメッセージで例外を受け取ります: in option 'id': invalid option value.

これを希望どおりに機能させるにはどうすればよいですか?

ありがとう、ポールH

4

3 に答える 3

1

aはプログラム オプション ライブラリに対して特別な意味を持っているため、astd::vector<int>としての typedefboost::program_options::value_semanticは希望どおりには機能しません。vector

このライブラリはベクトルの特別なサポートを提供します。オプションを複数回指定することができ、指定されたすべての値が 1 つのベクトルにまとめられます。

これは、そのような記述を意味します

typedef std::vector< int > IDList;
po::options_description desc( "Foo options" );
desc.add_options()
    ("id,x", po::value< IDList >(), "list of IDs")
;

std::vector<int>次のコマンドラインを指定すると、単一に結合されます

a.out --id 1 --id 2 --id 3 --id 4

結果はstd::vector4 つの要素を持つ になります。カスタムバリデーターを使用するには、特定のタイプを定義する必要があります。struct IDListこれが正しいアプローチです。

于 2011-02-26T01:41:05.213 に答える
0

コマンド ライン オプションを解析する独自の関数を作成してみてください。

こちらをご覧ください

reg_foo などの独自のパーサー関数を作成し、次のように使用します。

variables_map vm;
store(command_line_parser(argc, argv).options(desc).extra_parser(reg_foo)
          .run(), vm);

example/custom_syntax.cpp にある、boost で配布されているサンプル コードも参照してください。

于 2011-02-25T17:43:20.080 に答える