当您使用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) 我正在使用boost :: program_options从配置文件中获取参数.
据我所知,我可以手动创建一个文件,程序选项将解析它.但我正在寻找程序自动生成文件的方法.意思是打印出选项的名称及其值.例如:
>./main
Run Code Online (Sandbox Code Playgroud)
没有选项会生成看起来像这样的init.cfg
[wave packet]
width = 1
position = 2.0
[calculation parameters]
levels = 15
Run Code Online (Sandbox Code Playgroud)
然后我会进入该文件使用文本编辑器更改值并使用此文件:
>./main init.cfg
Run Code Online (Sandbox Code Playgroud)
一个好方法来解决这个问题就是让variables_map有operator<<.这样我就可以把它写到文件中.改变价值观.读取文件.所有格式相同,无需编写每一行.
我在文档或示例中找不到类似的东西.如果可能,请告诉我
编辑:Sam Miller展示了如何分段解析ini文件.但是,从boost :: program_options :: variables_map vm获取值仍然存在问题.我尝试了以下内容
for(po::variables_map::iterator it = vm.begin(); it != vm.end(); ++it)
{
if(it->first!="help"&&it->first!="config")
cout << "first - " << it->first << ", second - " << it->second.value() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
而不是it->second.value(),得到一个错误.我也试过了it->second.我也有一个错误:
icpc -lboost_serialization -lboost_program_options -c programOptions.cc
programOptions.cc(60): error: no operator "<<" matches these operands
operand types …Run Code Online (Sandbox Code Playgroud) 我似乎无法从命令行中读取配置文件多音色选项.配置文件的语法是什么?
这是添加选项描述的方式:
//parser.cpp
- - -
po::options_description* generic;
generic=new po::options_description("Generic options");
generic->add_options()
("coordinate",po::value<std::vector<double> >()->multitoken(),"Coordinates (x,y)");
Run Code Online (Sandbox Code Playgroud)
之后我解析命令和配置文件.
在命令行'--coordinate 1 2'工作.但是,当我尝试配置文件时:
coordinate = 1,2
Run Code Online (Sandbox Code Playgroud)
要么
coordinate= 1 2
Run Code Online (Sandbox Code Playgroud)
它没有给出invalid_option_value异常.那么多语言选项的配置文件的语法究竟是什么?
我正在使用boost :: program_options从命令行参数中读取用户的输入.它工作得非常好,允许我输出有用的使用信息并正确验证输入.但是,默认情况下,长选项名称必须在双击之后,例如--my_long_option短选项在单个短划线之后,并且必须是单个字符,例如; -m.
还有办法要么......
-?因此允许我拥有看起来像的命令行
./a.out -myopt1 foo -myopt2 bar
Run Code Online (Sandbox Code Playgroud)
这两种可能性应该具有相同的效果,但从编程的角度来看,第一种可能会更好.我看了一下boost :: program_options :: command_line_style,但看起来它看起来不像我需要的那样.
谢谢
编辑:进一步接受下面接受的答案,让它使用该样式必须添加以下代码(遵循提升文档的命名约定)
po::store(
po::command_line_parser(ac,av)
.options(desc)
.style(
po::command_line_style::unix_style
| po::command_line_style::allow_long_disguise)
.run(),
vm);
Run Code Online (Sandbox Code Playgroud) 我一直试图用boost :: program_options来验证我传递的选项.我的命令有几种模式,每种模式都有可以指定的相关参数.我要做的是确保这些相关的参数以模式传递,即
unicorn --fly --magic-wings-threshold
Run Code Online (Sandbox Code Playgroud)
--fly模式在哪里,--magic-wings-threshold是一个相关的参数.我注意到的是,如果--magic-wings-threshold有一个默认值,例如
("magic-wings-threshold,w", po::value<double>(&wings_thresh)->default_value(0.8, "0.8"),
"Magic wings maximum power"
)
Run Code Online (Sandbox Code Playgroud)
那我就不能用了
if (vm.count("magic-wings-threshold")( {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
检测用户是否通过了该参数.
似乎总是传递和检测默认值参数vm.count().有没有人知道变通方法或替代方案?
我有一个使用Boost.Program_options来存储和管理其配置选项的应用程序.我们目前正在远离配置文件并使用数据库加载配置.我编写了一个API,通过主机名和实例名从数据库中读取配置选项.(很酷!)但是,据我所知,没有办法手动将这些选项插入到boost Program_options中.有没有人用过这个,有什么想法吗?来自boost的文档似乎表明在该映射中获取内容的唯一方法是使用store函数,该函数可以从命令行或配置文件中读取(不是我想要的).基本上寻找一种手动将DB读取值插入到地图中的方法.
我需要能够boost::program_options解析在命令行上传递的双精度数组.对于正双打,这当然没有问题(std::vector<double>在add_options中使用多音),但对于负数,我知道这些是不明确的参数.
以下是我想要介绍的内容:
mycommand --extent -1.0 -2.0 -3.0 1.0 2.0 3.0 --some-other-argument somevalue
extent由一个Bounds具有至少一个构造函数的类支持,该构造函数接受六个单独的T参数(在本例中为 - double).
template <typename T>
class Bounds
{
public:
typedef T value_type;
typedef typename std::vector< Range<T> >::size_type size_type;
typedef typename std::vector< Range<T> > Ranges;
Bounds( T minx, T miny, T minz,
T maxx, T maxy, T maxz)
{
// fill Ranges vector
}
private:
Ranges ranges;
};
Run Code Online (Sandbox Code Playgroud)
还有什么我必须提供支持使用add_options接受Bounds课程?我想做类似的事情.可能?
namespace po = boost::program_options;
po::options_description options("options");
options.add_options() …Run Code Online (Sandbox Code Playgroud) 我最近开始使用boost::program_options并发现它非常方便.也就是说,有一件事遗漏,我无法以一种好的方式编码自己:
我想迭代在a中收集的所有选项,boost::program_options::variables_map以便在屏幕上输出它们.这应该成为一个便利功能,我可以简单地调用列出所有设置的选项,而无需在添加新选项或每个程序时更新功能.
我知道我可以检查并输出各个选项,但如上所述,这应该成为一个对实际选项无视的通用解决方案.我进一步知道我可以迭代内容,variables_map因为它只是一个扩展std::map.然后,我可以检查存储boost::any变量中的类型包含,并使用.as<>它将其转换回适当的类型.但这意味着要编写一个长开关块,每种类型都有一个外壳.对我来说,这看起来不是很好的编码风格.
所以问题是,是否有更好的方法来迭代这些选项并输出它们?
我正在使用Boost program_options以标准方式解析配置文件,如
program_options的multiple_sources.cpp示例文件中所示.
ifstream ini_file("config.ini");
po::store(po::parse_config_file(ini_file, desc, true), vm);
po::notify(vm);
Run Code Online (Sandbox Code Playgroud)
但是config.ini文件具有空键=值对,例如:
key1=value1
key2=value2
key3=
key4=
key5=value5
Run Code Online (Sandbox Code Playgroud)
尝试读取此文件会导致Boost错误:
boost::program_options::invalid_option_value
Run Code Online (Sandbox Code Playgroud)
boost :: program_options中是否有任何机制来读取具有空entires的配置文件?
任何帮助将非常感激.
我正在编辑这个问题,因为问题还没有解决.我将引用Boost(1.53)的例子.
这是完整的multiple_sources.cpp文件:
#include <boost/program_options.hpp>
namespace po = boost::program_options;
#include <iostream>
#include <fstream>
#include <iterator>
using namespace std;
// A helper function to simplify the main part.
template<class T>
ostream& operator<<(ostream& os, const vector<T>& v)
{
copy(v.begin(), v.end(), ostream_iterator<T>(os, " "));
return os;
}
int main(int ac, char* av[])
{
try {
int opt;
string config_file;
// Declare a …Run Code Online (Sandbox Code Playgroud) clang-format 似乎从这样的块中弄得一团糟:
desc.add_options()("help", "output usage")
("inputDirectory", po::value<boost::filesystem::path>()->required(), "The input path")
("outputDirectory", po::value<boost::filesystem::path>()->required(), "The output path");
Run Code Online (Sandbox Code Playgroud)
我知道// clang-format off明确不要格式化一个块,但有没有一套配置规则可以让它做一些合理的事情呢?