标签: boost-program-options

使用boost :: program_options打印普通和位置参数的帮助

当您使用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)

c++ boost command-line-arguments boost-program-options

16
推荐指数
1
解决办法
5789
查看次数

有没有办法打印配置文件的升级程序选项

我正在使用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)

c++ boost boost-program-options

15
推荐指数
1
解决办法
5319
查看次数

具有多个标记的boost :: program_options配置文件选项

我似乎无法从命令行中读取配置文件多音色选项.配置文件的语法是什么?

这是添加选项描述的方式:

//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异常.那么多语言选项的配置文件的语法究竟是什么?

c++ syntax boost-program-options optionparser config-files

15
推荐指数
2
解决办法
6282
查看次数

提升程序选项语法

我正在使用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)

c++ command-line boost boost-program-options

15
推荐指数
1
解决办法
6045
查看次数

使用vm.count()时,使用默认值提升程序选项

我一直试图用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().有没有人知道变通方法或替代方案?

c++ boost boost-program-options

15
推荐指数
1
解决办法
3312
查看次数

如何手动将选项插入boost.Program_options?

我有一个使用Boost.Program_options来存储和管理其配置选项的应用程序.我们目前正在远离配置文件并使用数据库加载配置.我编写了一个API,通过主机名和实例名从数据库中读取配置选项.(很酷!)但是,据我所知,没有办法手动将这些选项插入到boost Program_options中.有没有人用过这个,有什么想法吗?来自boost的文档似乎表明在该映射中获取内容的唯一方法是使用store函数,该函数可以从命令行或配置文件中读取(不是我想要的).基本上寻找一种手动将DB读取值插入到地图中的方法.

c++ configuration boost-program-options

13
推荐指数
1
解决办法
2923
查看次数

使用boost :: program_options接受负面双打

我需要能够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)

c++ command-line boost boost-program-options

13
推荐指数
2
解决办法
2934
查看次数

boost :: program_options:迭代并打印所有选项

我最近开始使用boost::program_options并发现它非常方便.也就是说,有一件事遗漏,我无法以一种好的方式编码自己:

我想迭代在a中收集的所有选项,boost::program_options::variables_map以便在屏幕上输出它们.这应该成为一个便利功能,我可以简单地调用列出所有设置的选项,而无需在添加新选项或每个程序时更新功能.

我知道我可以检查并输出各个选项,但如上所述,这应该成为一个对实际选项无视的通用解决方案.我进一步知道我可以迭代内容,variables_map因为它只是一个扩展std::map.然后,我可以检查存储boost::any变量中的类型包含,并使用.as<>它将其转换回适当的类型.但这意味着要编写一个长开关块,每种类型都有一个外壳.对我来说,这看起来不是很好的编码风格.

所以问题是,是否有更好的方法来迭代这些选项并输出它们?

c++ command-line boost boost-program-options

13
推荐指数
2
解决办法
4793
查看次数

Boost parse_config_file,空键值

我正在使用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)

c++ boost boost-program-options

13
推荐指数
1
解决办法
5349
查看次数

升级程序选项的clang格式

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明确不要格式化一个块,但有没有一套配置规则可以让它做一些合理的事情呢?

c++ boost-program-options clang-format

13
推荐指数
1
解决办法
503
查看次数