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-11-08 17:57:10

boost program_options的相关文章

boost库之program_options

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

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

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

boost:库program_options--第一篇

程式執行參數處理函式庫:Boost Program Options(1/N) 一般程式寫得大一點.或是需要比較有彈性,通常都需要在程式執行的時候,從外部讀取一些參數,來做為內部的設定值.一般來說,比較常見的方法,大概就是直接透過命令提示字元(command line)來下參數,或是透過讀取設定檔(例如 ini 檔)來讀取設定值. 以前者來說,雖然 C++ 的主函式.main() 本來就有 argc 和 argv 兩個參數,可以用來處理命令提示字元輸入的參數,但是實際上要去自己根據需求,一個一個來

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 ; // 外部变量 存储 参数

使用Boost.PropertyTree处理XML、JSON和INI数据

Boost.PropertyTree 应该是 Boost 1.41.0 开始正式加入 Boost 版本的.目前 ( 2010/02/28 ) 能下到的最新版本是 1.42.0. 主要作用/应用场合 Boost.PropertyTree 提供了一种结构化的数据存储容器.并且提供了一系列的解释器可以将内存中的结构与具体格式相互转换 (比如: INI, XML, JSON ). 至少可以用在: 进程间通讯或者跨语言的进程间的通讯 一些配置文件的存取 网络通讯协议的格式 基本用法 基本用法有 2 种场景

Wesnoth 1.9.7发布 很受欢迎的战棋游戏

Battle for Wesnoth 韦诺之战 Wesnoth是一款开源的.很受欢迎的战棋游戏,其有着平衡的战斗设计.简单的玩法和强大的联网对战功能,被评为最好的开源游戏之一. 一款在GNU通用公共许可证下发布的.开放源代码的.免费的.自由的回合制策略游戏.游戏的创意来自于世嘉平台上的梦幻模拟战.韦诺之战的规则简单,人工智能十分强大,具有极高的挑战性和趣味性.游戏拥有多国语言支持,包括伟大的汉语!而且还有官方中文论坛为玩家提供社区服务. 韦诺之战是一个基于六边形地图的回合制策略游戏,可以进行单机

Boost简介

来源:http://www.cnblogs.com/wangkangluo1/archive/2012/05/28/2521493.html 原文链接 一BOOST Boost带领你远远地超越了C++标准库,它使得C++编程更优雅.更有活力.更高产.(引自:Beyond the C++ Standard Library: An Introduction to Boost)(慢慢体会哦!) 二参考 主要: boost的在线document:http://boost.org/libs/librari

VS2008下编译BOOST 1.39的ASIO库

由于全部编译BOOST库需要的时间太长,而且耗费空间,况且我只需要用ASIO库,所以就没有必要全部编译了. boost库到www.boost.org上下载. 编译很简单,假设你的boost存放的目录是D:/BOOST_139. 1.运行VS2008的命令提示行,进入D:/BOOST_139/tools/jam;执行build_dist.bat,这样就产生了bjam.exe,该文件位于/tools/jam/stage/bin.ntx86 2.为了方便,将bjam.exe拷贝到D:/BOOST_13

Boost下载安装编译配置使用指南

转载:http://www.cppblog.com/jerryma/archive/2011/10/17/158554.html --更新于2011/7/19,目前我已对boost的安装和使用有了新的认识,因此也会对两年前写的这篇文章做大幅修改,网上转载版本泛滥,请以本文为准. 理论上,本文适用于boost的各个版本,尤其是最新版本1.47.0:适用于各种C++编译器,如VC6.0(部分库不支持),VS2003,VS2005,VS2008,VS2010,gcc,C++ Builder等.先总结一