7

プログラムへのコマンド ライン パラメータを処理するために boost::program_options を使用しています。以下のプログラムでは、algo、exchanges、および admin_port をグループ化して、それらがすべて提供されるようにしたいと考えています。

また、それらがグループであることを明確にする方法でそれらを印刷したいと思います。

これはどのように達成するのが最善でしょうか?

#include <boost/program_options.hpp>
#include <cassert>
#include <iostream>
#include <string>

namespace prog_opts = boost::program_options;

int main(int argc, char *argv[])
{
    int rc = 0;

    prog_opts::options_description desc("Usage");
    desc.add_options()
        ("algo", prog_opts::value<std::string>(), "Name of the algo to run")
        ("exchanges", prog_opts::value< std::vector<std::string> >(), "Name(s) of the exchanges which will be available for use")
        ("admin_port", prog_opts::value<unsigned>(), "Admin port on which admin requests will be listened for")
        ("version", "Show version information")
        ("help", "Show help information");

    prog_opts::variables_map args;

    try
    {
        prog_opts::store(prog_opts::parse_command_line(argc, argv, desc), args);
        prog_opts::notify(args);

        if(args.count("algo") && args.count("exchanges") && args.count("admin_port"))
        {
            //TODO:
        }
        else if(args.count("version"))
        {
            //TODO:
        }
        else if(args.count("help"))
        {
            std::cout << desc << std::endl;
        }
        else
        {
            std::cerr << desc << std::endl;
            rc = 1;
        }  
    }
    catch(const prog_opts::error& e)
    {
        std::cerr << "Failed start with given command line arguments: " << e.what() << std::endl;
        rc = 1;
    }

    return rc;
}  
4

2 に答える 2

1

必須グループを作成するには、それを行うことができます

prog_opts::value<std::string>()->required()

プログラムのオプションの説明部分で。これは次のようになります。

#include <boost/program_options.hpp>
#include <cassert>
#include <iostream>
#include <string>

namespace prog_opts = boost::program_options;

int main(int argc, char *argv[])
{
int rc = 0;

prog_opts::options_description desc("Usage");
desc.add_options()
    ("algo", prog_opts::value<std::string>()->required(), "Name of the algo to run")
    ("exchanges", prog_opts::value< std::vector<std::string> >()->required(), "Name(s) of the exchanges which will be available for use")
    ("admin_port", prog_opts::value<unsigned>()->required(), "Admin port on which admin requests will be listened for")
    ("version", "Show version information")
    ("help", "Show help information");

prog_opts::variables_map args;

try
{
    prog_opts::store(prog_opts::parse_command_line(argc, argv, desc), args);
    prog_opts::notify(args);

    if(args.count("algo") && args.count("exchanges") && args.count("admin_port"))
    {
        //TODO:
    }
    else if(args.count("version"))
    {
        //TODO:
    }
    else if(args.count("help"))
    {
        std::cout << desc << std::endl;
    }
    else
    {
        std::cerr << desc << std::endl;
        rc = 1;
    }  
}
catch(const prog_opts::error& e)
{
    std::cerr << "Failed start with given command line arguments: " << e.what() << std::endl;
    rc = 1;
}

return rc;
}

詳細については、ブーストのドキュメントを確認することをお勧めします: http://www.boost.org/doc/libs/1_32_0/doc/html/program_options/overview.html#id548509

また、より複雑な引数の依存関係については、いくつかのオプションの説明を作成して、それらを「グループ化」することが理にかなっている場合があります。 http://www.boost.org/doc/libs/1_32_0/doc/html/program_options/howto.html#id549397

于 2013-02-18T16:18:56.647 に答える
0

次のような方法で「手動で」実装します。それ以外の場合にこれを行うために Boost が提供する機能については知りません。

unsigned int requiredArgsGroupCount = args.count("algo") + args.count("exchanges") + args.count("admin_port");
if ( (requiredArgsGroupCount > 0) && (requiredArgsGroupCount < 3) )
{
    // Indicate that all three arguments must be specified
}

引数の説明テキストで、1 つが指定されている場合は 3 つすべてが必要であることを示すだけです。

于 2012-11-13T15:19:36.993 に答える