boost program_options

一直认为boost都是hpp直接调用就可以了,最近遇到两个例子都不是这样的一个是boost的thread,另外一个就是这个了,boost在编译好之后会有库文件的,注意不是在当前的libs下面,而是stage/libs下面,我们在使用这个模块的时候要加上相应的动态或者静态的库。

当我们写一些小程序的时候难免要写一些输入参数,当然用linux自带的也可以

[cpp] view plaincopy

  1. int next_option;
  2. /* Parse options. */
  3. do {
  4. next_option = getopt_long (argc, argv, short_options, long_options, NULL);
  5. }while(next_options);

但是我们要写很多error handing,user manual 之类的, 比较麻烦,而且打印出来的格式也不是很好看。

那boost的program_options可以帮助我们解决这个问题。

boost program_options不仅支持配置command line,而且支持配置像INI一样的配置文件,这个模块非常好,下面是对配置文件格式的说明:

语法大致有三条,一个是name value的对应关系,另一个是section的模块,最后一个是注释的规范。

Configuration file parser

The parse_config_file function implements parsing of simple INI-like configuration files. Configuration file syntax is line based:

  • A line in the form:

    name=value
            

    gives a value to an option.

  • A line in the form:
    [section name]
            

    introduces a new section in the configuration file.

  • The # character introduces a comment that spans until the end of the line.

The option names are relative to the section names, so the following configuration file part:

[gui.accessibility]
visual_bell=yes
      

is equivalent to

gui.accessibility.visual_bell=yes
      

如何实现一对多的支持?

如果只是command line里面的很简单 只要加一个token就可以,但是如果是配置文件的则validate

实现很简单:

po::value<vector<float> >(&(paralist))->multitoken()

注意利用第三个参数重载

namespace boost{
void validate(boost::any& v,
          const vector<string>& values,
            vector<float>*, int) {
    cout << "hello" << endl;
        vector<double> dvalues;
          for(vector<string>::const_iterator it = values.begin();
                      it != values.end();
                          ++it) {
                  //stringstream ss(*it);
                  cout<<*it<<endl;
                            }
}
}

如何支持负数?

负数和program option会有冲突,一般通过加引号来处理,或者通过去除短option,只支持长option

char* v[] = {"name","--IDlist=0","1","200","-2"};
int c = 5;

std::vector<int> IDlist;

namespace po = boost::program_options;
po::options_description commands("Allowed options");
commands.add_options()
    ("IDlist",po::value< std::vector<int> >(&IDlist)->multitoken(), "Which IDs to trace: ex. --IDlist=0 1 200 -2")
    ("help","print help")
;

po::variables_map vm;
po::store(parse_command_line(c, v, commands, po::command_line_style::unix_style ^ po::command_line_style::allow_short), vm);
po::notify(vm);

BOOST_FOREACH(int id, IDlist)
    std::cout << id << std::endl;

下面讲一下具体的使用体会

1 打印很方便尤其是help manual, 对各种命令的错误的提示很好

2 type 和 name直接关联,根据名字直接读到变量中

3 支持command和文本配置文件,不同的源之间可以合并使用

4 没有办法指定变量的有效范围。

总之,用了之后颇有点专业软件的风范。

http://www.boost.org/doc/libs/1_45_0/doc/html/program_options.html

http://stackoverflow.com/questions/2935587/handle-complex-options-with-boosts-program-options/2939249#2939249

时间: 2024-08-05 12:33:35

boost program_options的相关文章

boost库之program_options

介绍 命令行接口是普遍,基础的人机交互接口,从命令行提取程序的运行时选项的方法有很多.你可以自己编写相对应的完整的解析函数,或许你有丰富的C语言编程经验,熟知getopt()函数的用法,又或许使用Python的你已经在使用optparse库来简化这一工作.大家在平时不断地谈及到"不要重复造轮子",那就需要掌握一些顺手的库,这里介绍一种C++方式来解析命令行选项的方法,就是使用Boost.Program_options库. program_options提供程序员一种方便的命令行和配置文

boost之program_options库,解析命令行参数、读取配置文件

一.命令行解析 tprogram_options解析命令行参数示例代码: [cpp] view plaincopy #include <iostream> using namespace std; #include <boost/program_options.hpp> namespace po = boost::program_options; int main(int argc, char*argv[]) { //int level; po::options_descripti

[C++Boost]程序参数项解析库Program_options使用指南

介绍 程序参数项(program options)是一系列name=value对,program_options 允许程序开发者获得通过命令行(command line)和配置文件(config file)获取这些参数项. 为什么需要这样一个库?为什么比你手工写代码分解命令行参数要好? 使用更容易.定义参数处理的语法简单,库自身很小.像转换参数值到指定的类型和保存参数值到变量的事情都是自动处理. 错误报告更友好.可报告错误的命令行参数.另外这个库能自动生成使用帮助,避免手工更新使用帮助导致的不一

boost库中的 program_options

1.阅读rviz中的源码时在rviz/visualizer_app.cpp中遇到如下代码: po::options_description options; options.add_options() ("help,h", "Produce this help message") ("splash-screen,s", po::value<std::string>(), "A custom splash-screen ima

boost的property_tree组件

1.1 缘起 stl中对线性表有充分的实现,无论是vector还是list都是典型的线性表,即便是set和map,尽管实现上采用了诸如红黑树之类的树形结构,但那仅仅是为了快速检索的需要,从语义上来说它们依旧是线性表,无法表达目录树这种树形结构.boost中的property_tree可以看做是对树形结构实现的补充,我们大可把它扩展应用到各种需要树形结构的地方. 当我们拥有了一个树性结构以后,那么也就同时拥有了树形结构中的每个节点的访问权,很自然的,我们希望每个节点都可以方便的检索(类似于输入一个

boost::xml——基本操作以及中文乱码解决方案

下面是本人使用boost库的xml部分的基础操作,并且解决对于大家使用boost库读写中文xml内容出现的乱码问题. 1.实现boost库xml基本操作2.解决boost对xml中中文乱码问题3.实现普通字符串和宽字符串的傻瓜切换(模仿tchar.h)4.代码运行环境为VS2010,需要导入boost库才能正常运行5.VS2010运行时可能会发生错误.例如:cl.exe 或者 cvtres.exe 报错. 解决办法就是重新打开项目或者切换其它正常项目运行一下(反正我是这么解决的) 下面是源码部分

Makefile生成器,使用C++和Boost实现

今天学习了一下Boost的文件遍历功能,同一时候发现GNU编译器有-MM选项.能够自己主动生成依赖关系,于是利用以上两点写了一个Makefile生成器. 能够生成一般的单个可运行文件的Makefile.使用的是Windows+Mingw+boost环境.假设使用Linux,仅仅需在程序中的两个System系统调用处和clean标签生成处将del 改成rm相关操作就好了. 如今更改成了Linux版本号.下载的版本号是Windows的. 以下是源码: makemake.cpp: #include <

boost 分析命令行参数

[cpp] view plaincopy #include <boost/program_options.hpp> #include <iostream> #include <vector> using namespace std; using namespace  boost::program_options; int main(int argc, char* argv[]) { string one ; // 外部变量 存储 参数one的值 vector<st

boost.property_tree解析xml的帮助类以及中文解析问题的解决(转)

boost.property_tree可以用来解析xml和json文件,我主要用它来解析xml文件,它内部封装了号称最快的xml解析器rapid_xml,其解析效率还是很好的.但是在使用过程中却发现各种不好用,归纳一下不好用的地方有这些:获取不存在的节点时就抛出异常 获取属性值时,要排除属性和注释节点,如果没注意这一点就会抛出异常,让人摸不着头脑. 内存模型有点怪. 默认不支持中文的解析.解析中文会乱码. ptree获取子节点 获取子节点接口原型为get_child(node_path),这个n