gpt4 book ai didi

c++ - 将 boost::program_options 分组到强制组中

转载 作者:可可西里 更新时间:2023-11-01 18:39:42 27 4
gpt4 key购买 nike

我正在使用 boost::program_options 来处理程序的命令行参数。在下面的程序中,我希望将 algo、exchange 和 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;
}

最佳答案

要创建强制组,您可以使用

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;
}

我建议您详细查看 boost 文档: 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

关于c++ - 将 boost::program_options 分组到强制组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12063465/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com