我正在使用Boost程序选项库来解析命令行参数.
我有以下要求:
我怎么处理这个?这是我的代码处理这个,我发现它非常多余,我认为必须有一个容易做的,对吧?
#include <boost/program_options.hpp>
#include <iostream>
#include <sstream>
namespace po = boost::program_options;
bool process_command_line(int argc, char** argv,
std::string& host,
std::string& port,
std::string& configDir)
{
int iport;
try
{
po::options_description desc("Program Usage", 1024, 512);
desc.add_options()
("help", "produce help message")
("host,h", po::value<std::string>(&host), "set the host server")
("port,p", po::value<int>(&iport), "set the server port")
("config,c", po::value<std::string>(&configDir), "set the config path")
;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
if (vm.count("help"))
{
std::cout << desc << "\n";
return false;
}
// There …Run Code Online (Sandbox Code Playgroud) 我有两个相关的问题:
使用Boost程序选项允许传递一系列值的最简单方法是什么?我的目标是避免prog --opt 1 --opt 2 --opt 3和prog --opt 1 2 3反而.
什么是有需要的选项最简单的方法正好两个数字,如prog --opt 137 42?
(我不需要任何"免费"程序参数.)
在线程序选项的增强教程中:http://www.boost.org/doc/libs/1_39_0/doc/html/program_options/tutorial.html#id2891824
它说完整的代码示例可以在"BOOST_ROOT/libs/program_options/example"目录中找到.我无法弄清楚这是哪里.任何人都可以帮我找到这些例子吗?
这就是问题所在.为什么我会使用implicit_value而不是default_value,反之亦然?
谢谢!
只有在具有value_semantic的情况下,才能将通知程序用于解析选项.给定通知程序自动处理无值选项的最佳方法是什么?
简单的方法是使用隐式赋值创建一个虚拟value_semantic,这样用户就可以传递没有值的选项.这导致明确提供值的可能性.如果提供了值,则可以添加运行时检查并抛出错误.
更新:但是,这在位置选项存在的情况下不起作用,因为位置选项的值可以遵循无值选项,将异常作为给定值给出它.
我想为我的程序实现子命令.我还需要为不同的子命令提供不同的参数选项.使用Boost.Program_options执行此操作的最佳方法是什么?
子命令用于svn,git和apt-get等程序.
例如,在GIT中,一些可用的子命令是:
git status
git push
git add
git pull
Run Code Online (Sandbox Code Playgroud)
我的问题与这个人的问题基本相同:http://boost.2283326.n4.nabble.com/subcommands-with-program-options-like-svn-command-td2585537.html
使用时boost::program_options,如何设置参数名称boost::program_options::value<>()?
#include <iostream>
#include <boost/program_options.hpp>
int main()
{
boost::program_options::options_description desc;
desc.add_options()
("width", boost::program_options::value<int>(),
"Give width");
std::cout << desc << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给出:
--width arg Give width
Run Code Online (Sandbox Code Playgroud)
我想要的是arg用更具描述性的名称替换名称NUM:
--width NUM Give width
Run Code Online (Sandbox Code Playgroud) 我最近发现了一个未记录的功能boost::program_options,即它接受"*"作为一个特殊的通配符,允许声明一组具有相同前缀的选项,如下所示:
configOptions.add_options()
("item_*", value<int>(), "items");
Run Code Online (Sandbox Code Playgroud)
该声明担任预期和认可item_1,item_3等等,而拒绝未知选项.那么问题是,如何编写一个自定义验证函数,它将使用options键及其值填充映射,如下所示:
map<string, int> itemsMap;
options_description items("items options");
items.add_options()
("item_*",value<map<string, int>>(&itemsMap)->multitoken(), "items")
;
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 如何从validate()函数中获取验证选项的密钥?
template <typename T> void validate(boost::any& v, const std::vector<std::string>& values, map<string, T> *, int)
Run Code Online (Sandbox Code Playgroud) 我试图验证命令行输入到我已定义的枚举,但得到编译器错误.我使用Handle复杂选项和Boost的program_options作为例子.
namespace po = boost::program_options;
namespace Length
{
enum UnitType
{
METER,
INCH
};
}
void validate(boost::any& v, const std::vector<std::string>& values, Length::UnitType*, int)
{
Length::UnitType unit;
if (values.size() < 1)
{
throw boost::program_options::validation_error("A unit must be specified");
}
// make sure no previous assignment was made
//po::validators::check_first_occurence(v); // tried this but compiler said it couldn't find it
std::string input = values.at(0);
//const std::string& input = po::validators::get_single_string(values); // tried this but compiler said it couldn't find it
// I'm …Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用Boost程序选项库的程序,我注意到以下语法在我看到之后一直困扰着我:
desc.add_options()
("help","produce help message")
( /* other flag, value, description pairs here */)
;
Run Code Online (Sandbox Code Playgroud)
我在标题中看到,operator()被覆盖了,但是我不确定它是如何允许它在语法上正确的.
其次,与多次调用add_options()相比,这种语法是否有任何优势(除了展示你可以像这样操作语法这一事实)?