有没有办法用boost :: program_options收集指定参数后的所有值?虽然我需要注意两个警告,我需要接受无法识别的参数,我需要接受可能包含破折号的值.我尝试过使用command_line_parser和parse_command_line,我可以得到无法识别的或包含破折号的值,但不能同时使用两者.
示例:./ myprog Ignore1 Ignore2 - 接受1 --AlsoAccept 2 --AcceptAll 1 2 -3 4
我真的不关心验证--AcceptAll是最后一个标志; 我只是在寻找逻辑,在该标志之后返回一个字符串向量.
我正在使用boost程序选项从命令行参数获取布尔值.我希望我的论点被指定为"Y",是","N","否".
实际上我的代码使用临时字符串来完成它
boost program options最重要的是,我还使用另一个临时字符串获取默认值.
我做了所有这些工作,因为我尝试了下面的代码,但是没有用
namespace pod = boost::program_options;
("Section.Flag",
pod::value<bool>(&myFlag_bool)->default_value( false ),
"description")
Run Code Online (Sandbox Code Playgroud)
你知道升级程序选项是否可以比我用来实现它的更好?
有没有一种简单的方法可以将帮助选项与"真正的"程序选项分开?事实上,是否可以定义选项的层次结构,即BNF:
options := help_options | program_options
help_options := '-h'
program_options := '-m1' mode1options | '-m2' mode2options
mode1options := number
...
Run Code Online (Sandbox Code Playgroud)
或者有更好的方法来实现这一目标吗?我应该恢复精神吗?
我想从配置文件中重新加载一些值。我知道,po::store如果值存在于中,则不会更改variables_map。是否有替代方法即使值已经存在也可以替换?
我尝试从中删除要重新加载的值variables_map,但是po::store无论如何都不会添加新值(即使也无法访问旧值)。
我正在使用Boost Graph和Program Options构建图形生成器.例如,有两种类型的组件C和W,每种组件具有1个源,1个接收器和一些附加参数以指定其间的拓扑.我希望能够按照命令行参数的顺序将它们拼接在一起.
例如:
./bin/make_graph -c4,5,1 -w3,3 -c3,1,2
Run Code Online (Sandbox Code Playgroud)
应创建类似于以下内容的图形:
C -- W -- C
Run Code Online (Sandbox Code Playgroud)
但:
./bin/make_graph -c4,5,1 -c3,1,2 -w3,3
Run Code Online (Sandbox Code Playgroud)
应创建类似于以下内容的图形:
C -- C -- W
Run Code Online (Sandbox Code Playgroud)
使用boost :: program_options,我无法确定如何提取确切的顺序,因为它使用value_type == vector <string>(在我的情况下)将相同string_key的选项"组合"到一个映射中.
通过迭代地图,订单就会丢失.有没有办法不重复解析,但每次解析一个选项时都有一个叫做(可能是回调)的函数?我找不到这方面的文件.还有其他建议吗?
为了说服你,我没有说明这一点,这就是我到目前为止所做的:
namespace bpo = boost::program_options;
std::vector<std::string> args_cat, args_grid, args_web;
bpo::options_description desc("Program options:");
desc.add_options()
.operator ()("help,h","Displays this help message.")
.operator ()("caterpillar,c",bpo::value< std::vector<std::string> >(&args_cat)->default_value( std::vector<std::string>(1,"4,7,2"), "4,7,2" ),"Caterpillar tree with 3 parameters")
.operator ()("grid,g",bpo::value< std::vector<std::string> >(&args_grid)->default_value( std::vector<std::string>(1,"3,4"), "3,4" ),"Rectangular grid with 2 parameters")
.operator ()("web,w",bpo::value< std::vector<std::string> >(&args_web)->default_value( std::vector<std::string>(1,"3,4"), "3,4" ),"Web with …Run Code Online (Sandbox Code Playgroud) 我正在使用Boost.program_options来解析我实现POSIX实用程序的命令行.举个简单的例子吧cmp.
现在我想有一个额外的参数--help来显示所有参数的描述,这在这种情况下很重要.我有:
po::options_description options("Options");
options.add_options()("help", "Show this help output.")
(",l", "(Lowercase ell.) Write the byte number (decimal) and the differing bytes (octal) for each difference.")
(",s", "Write nothing for differing files; return exit status only.")
po::positional_options_description operands;
operands.add("file1", 1);//, "A pathname of the first file to be compared. If file1 is '-', the standard input shall be used.")
operands.add("file2", 1);//, "A pathname of the second file to be compared. If file2 is '-', the standard input …Run Code Online (Sandbox Code Playgroud) 使用命令行选项,我可以执行以下操作:
po::variables_map vm;
auto parsedOptions = po::command_line_parser(argc, argv).options(optionsDescription1).allow_unregistered().run();
po::store(parsedOptions, vm);
po::notify(vm);
auto unregistered = po::collect_unrecognized(parsedOptions.options, po::include_positional);
po::variables_map vm2;
auto parsedOptions2 = po::command_line_parser(unregistered).options(optionsDescription2).run();
po::store(parsedOptions2, vm2);
po::notify(vm2);
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,因为collect_unregistered()收集命令行令牌的方式与命令行中出现的完全相同.但是,它不适用于配置文件.我可以解析一个允许未注册选项的配置文件,但是当我收集未注册的选项时,我得到一个我无法使用的结果.
po::variables_map vm;
auto parsedOptions = po::parse_config_file<char>(filename, optionsDescription1, true);
po::store(parsedOptions, vm);
po::notify(vm);
auto unregistered = po::collect_unrecognized(parsedOptions.options, po::include_positional);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我得到列出的选项的名称和值.例如,如果配置文件包含以下选项:
unregistered_option1=value1
unregistered_option2=value2
Run Code Online (Sandbox Code Playgroud)
然后我得到的值unregistered_option1,value1,unregistered_option2,value2在串矢量unregistered.Boost的解析器无法对此格式执行任何有用的操作.有没有办法解析这个列表(即解析第一个options_description用不同的方法识别的所有选项options_description)?当然我可以用第二个options_description用allow_unregisteredset 来解析文件,但是后来我无法检查两个描述都不知道的选项.
我熟悉boost的程序选项实用程序,我想知道是否有一种定义互斥选项组的方法.即,我的程序有不同的流程:
program --first --opt1 --opt2 ...
program --second --opt3 --opt4 ...
所以,我对不同流程的选择是相互排斥的.有没有办法定义互斥的选项组?
当然下面代码会这样做:
/* Function used to check that 'opt1' and 'opt2' are not specified
at the same time. */
void conflicting_options(const variables_map& vm,
const char* opt1, const char* opt2)
{
if (vm.count(opt1) && !vm[opt1].defaulted()
&& vm.count(opt2) && !vm[opt2].defaulted())
throw logic_error(string("Conflicting options '")
+ opt1 + "' and '" + opt2 + "'.");
}
int main(int ac, char* av[])
{
try {
// Declare three groups of options.
options_description first("First …Run Code Online (Sandbox Code Playgroud) 使用程序选项,我正在检查有效的参数组合.但由于某种原因,gpu参数是一个bool,无论我是否在命令行上将其设置为false,它总是正确的.如果我在命令行中指定了gpu选项,有没有办法可以为false?我希望能够创建一个bool变量来表示是否使用了命令行上的选项.
另外,我找不到有关variables_map的count()的任何文档.它是std :: map函数吗?
部分代码:
namespace po = boost::program_options;
po::options_description desc("Allowed Options");
desc.add_options()
("help,h", "Produce help message")
("remove_database,r",po::value<std::vector<std::string>>
(&remove_database),
"Remove a pre-built database, provide a name(s) of the database")
("gpu,u", po::bool_switch()->default_value(false),
"Use GPU? Only for specific algorithms");
po::variables_map vm;
po::store(po::parse_command_line(argc,argv,desc),vm);
po::notify(vm);
//Processing Cmd Args
bool help = vm.count("help");
bool remove = vm.count("remove_database");
bool gpu = vm.count("gpu");
test(help,"help");
test(remove, "remove");
test(gpu, "gpu");
.....
void test(bool var1, std::string var2){
if(var1)
std::cout << var2 << " is active " << std::endl;
else
std::cout …Run Code Online (Sandbox Code Playgroud) 我有一个boost :: program_options选项,可以将所需的输入选项成功解析为向量,但是我没有看到如何为它提供默认值。例:
base.add_options()
("vector_value",po::value<std::vector<double> >(&vecoption)->multitoken(),"description");
Run Code Online (Sandbox Code Playgroud)
可以很好地将值读入vecoptions之类的东西
base.add_options()
("int_value",po::value<int>(&intoption)->default_value(1),"description");
Run Code Online (Sandbox Code Playgroud)
也可以正常工作,但是尝试为vector参数赋予默认值,例如in
base.add_options()
("vector_value",po::value<std::vector<double> >(&vecoption)->default_value(std::vector<double>{0,1,2}),"description");
Run Code Online (Sandbox Code Playgroud)
给出编译器错误
错误:静态断言失败:源类型既不是std :: ostream`able也不是std :: wostream`able
如何创建具有默认值(如{0,1,2})的向量值float选项?