我在我的程序中使用boost :: program_options.我想强制要一个标志.是否可以使用program_options以一种它自己强制执行此操作的方式执行此操作?即,抛出错误信息?
有没有办法为参数设置一组允许的输入变量?例如,参数"arg"只能包含像"cat"和"dog"这样的字符串值.
我想为我的一些命令行参数使用默认值.如何判断program_options默认选项是什么,如果用户没有提供参数,如何告诉我的程序使用默认值?
假设我想要一个参数来指定在杀人狂暴中发送的机器人数量,默认值为3.
robotkill --robots 5会产生5 robots have begun the silicon revolution,而
robotkill(没有提供论据)会产生3 robots have begun the silicon revolution.
我的计划(prog.exe)支持以下四个标志:-P,-p,-b和-s.然而:
-b并且-p必须一起指定,构成一个集合,并具有数值,例如-b 42-s 不能用上面的集合指定,反之亦然-P 两种情况都是强制性的因此,prog.exe只能作为两者运行
prog.exe -P -s
Run Code Online (Sandbox Code Playgroud)
要么
prog.exe -P -b -42 -p 8
Run Code Online (Sandbox Code Playgroud)
有没有办法在boost程序选项中指定上述互斥命令行选项集?
c++ command-line-arguments boost-program-options command-line-parsing
我正在尝试编译multiple_sources.cpp以在我的计算机上编译.我正在运行Xubuntu Lucid Lynx全面更新.
它将编译没有问题,g++ -c multiple_sources.cpp但当我尝试链接并使g++ multiple_sources.o我得到一个exectuable 得到:
multiple_sources.cpp:(.text+0x3d): undefined reference to `boost::program_options::options_description::m_default_line_length'
multiple_sources.cpp:(.text+0x87): undefined reference to `boost::program_options::options_description::options_description(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)'
multiple_sources.cpp:(.text+0x15a): undefined reference to `boost::program_options::options_description::add_options()'
multiple_sources.cpp:(.text+0x17b): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, char const*)'
multiple_sources.cpp:(.text+0x193): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, char const*)'
multiple_sources.cpp:(.text+0x1af): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)'
multiple_sources.cpp:(.text+0x1eb): undefined reference to `boost::program_options::options_description::m_default_line_length'
multiple_sources.cpp:(.text+0x252): undefined reference to `boost::program_options::options_description::options_description(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)'
...
Run Code Online (Sandbox Code Playgroud)
et cetera …
我需要实现一个可选的标志,比如-f/ --flag.由于这是一个标志,因此没有关联的值.在我的代码中,我只需要知道标志是否已设置.使用boost :: program_options执行此操作的正确方法是什么?
我有一个程序,使用不同的多级模型生成图形.每个多级模型由一代较小的种子图(例如,50个节点)组成,可以从多个模型创建(例如 - 对于每个可能的边,选择以概率p包括它).
在种子图生成之后,使用另一组模型之一将图扩展为更大的图(例如1000个节点).
在两个阶段的每个阶段中,每个模型需要不同数量的参数.
我想让program_options根据模型的名称解析不同的可能参数.
例如,假设我有两个种子图模型:SA,有1个参数,SB,有两个.同样对于扩展部分,我有两个模型:A和B,分别有1和2个参数.我希望能够做到这样的事情:
./graph_generator --seed=SA 0.1 --expansion=A 0.2
./graph_generator --seed=SB 0.1 3 --expansion=A 0.2
./graph_generator --seed=SA 0.1 --expansion=B 10 20
./graph_generator --seed=SB 0.1 3 --expansion=B 10 20
Run Code Online (Sandbox Code Playgroud)
并正确解析参数.这甚至可能吗?
指示命令行程序选项结束的传统方法是使用该选项--.如何让boost :: program_options将此识别为一个选项并接受命令行的其余部分作为位置参数?以下不起作用:
namespace po = boost::program_options;
po::positional_options_description posOpts;
posOpts.add("keywords", 1);
posOpts.add("input", 1);
std::vector<std::string> final_args;
po::options_description desc("Allowed Options");
desc.add_options()
...
("", po::value< std::vector<std::string> >(&final_args)->multitoken(), "end of options")
...
;
po::command_line_parser(argc, argv).options(desc).positional(posOpts).run();
Run Code Online (Sandbox Code Playgroud)
如果我foo bar作为参数给出,我什么都没有final_args(正如预期的那样),但是当我-- foo bar作为参数给出时(我期望找到final_args[0] == "foo"和final_args[1] == "bar").我在这里假设这--是一个长参数,空字符串作为其参数名称.相反,如果它应该被解释为一个短参数,-作为参数名称,我该如何指定?从我可以看到,将参数规范从""to 更改为",-"不影响结果.
如何让boost :: program_options --正确处理?
编辑:这是尝试通过创建一个Tim Sylvester建议extra_style_parser:
std::vector<po::option> end_of_opts_parser(std::vector<std::string>& args) {
std::vector<po::option> result;
std::vector<std::string>::const_iterator i(args.begin());
if (i …Run Code Online (Sandbox Code Playgroud) 当您使用Boost库时program_options,可以非常轻松地为您的程序打印帮助:
boost::program_options::variables_map options;
boost::program_options::options_description optionsDesc;
boost::program_options::positional_options_description positionalOptionsDesc;
//...
if(options.count("help"))
{
cerr << optionsDesc << endl;
}
Run Code Online (Sandbox Code Playgroud)
但是,如何将选项添加positional_options_description到帮助消息中?在本教程中,我可以在本节末尾看到这种设置的输出:
http://www.boost.org/doc/libs/1_52_0/doc/html/program_options/tutorial.html#id2607297
该选项input-file打印在帮助中,它是位置.但我看不到代码.是否有内置的方式来打印它,就像options_description你需要手动操作一样?显然这<<不起作用positional_options_description,编译错误是:
error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
Run Code Online (Sandbox Code Playgroud) //Using boost program options to read command line and config file data
#include <boost/program_options.hpp>
using namespace std;
using namespace boost;
namespace po = boost::program_options;
int main (int argc, char *argv[])
{
po::options_description config("Configuration");
config.add_options()
("IPAddress,i","IP Address")
("Port,p","Port")
;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, config),vm);
po::notify(vm);
cout << "Values\n";
string address = (vm["IPAddress"].as<std::string >()).c_str();
string port = (vm["Port"].as<std::string>()).c_str();
cout << (vm["IPAddress"].as< string >()).c_str();
cout << " " << (vm["Port"].as<string>()).c_str();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输入的值是否以某种方式无法打印?
这是gdb输出,似乎是转换问题:
在抛出'boost :: exception_detail :: clone_impl的实例后终止调用
'what():boost :: bad_any_cast:使用boost …