简介

很多人使用界面来输入数据,本文的程序介绍如何使用Boost的program_options控制输入。

程序中使用了:

1. 短选项

2. 可以指定多个参数的选项


程序

#include <iostream>
#include <vector>
#include <string>
using namespace std;

// boost header files
#include <boost/program_options.hpp>
namespace boostpo = boost::program_options;
class Options
{
public:
    Options(int &argc, char** &argv){
        boostpo::options_description opts = boostpo::options_description("Allowed options");
        opts.add_options()
            ("help,h"         , "produce help message")
            ("int_opt,i"      , boostpo::value<int>()->default_value(0)        , "int option")
            ("string_opt,s"   , boostpo::value<std::string>()                  , "string option")
            ("float_opt,f"    , boostpo::value<float>()                        , "float option")
            ("multi_doubles,m", boostpo::value<vector<double> >()->multitoken(), "multiple doubles")
            ;
        boostpo::variables_map vm;
        try{
            boostpo::store(boostpo::parse_command_line(argc, argv, opts), vm);
        }
        catch (boost::exception &e){
            cerr << "wrong options" << endl;
            cout << opts << endl;
            exit(EXIT_FAILURE);
        }

        int_opt = vm["int_opt"].as<int>();

        if (vm.count("string_opt")){
            string_opt = vm["string_opt"].as<string>();
        }
        else{
            cout << opts << endl;
            cerr << "input string option please." << endl;
            exit(EXIT_FAILURE);
        }

        if (vm.count("float_opt")){
            float_opt = vm["float_opt"].as<float>();
        }
        else{
            cout << opts << endl;
            cerr << "input float option please." << endl;
            exit(EXIT_FAILURE);
        }

        if (vm.count("multi_doubles")){
            doubles_opt = vm["multi_doubles"].as<vector<double> >();
        }
        else{
            cout << opts << endl;
            cerr << "input multi_doubles option please." << endl;
            exit(EXIT_FAILURE);
        }
    }
public:
    int int_opt;
    float float_opt;
    std::string string_opt;
    vector<double> doubles_opt;
};

int main(int argc, char **argv){
    Options ops(argc, argv);
    cout << "int    option    : " << ops.int_opt << endl;
    cout << "string option    : " << ops.string_opt << endl;
    cout << "float  option    : " << ops.float_opt << endl;
    cout << "multiple doubles : ";
    for (size_t t = 0; t < ops.doubles_opt.size(); t++){
        cout << ops.doubles_opt[t] << " ";
    }
    return EXIT_SUCCESS;
}

实验

> demo.exe  -i 12 -s hello -f 11 -m 12.4 23.4
int    option    : 12
string option    : hello
float  option    : 11
multiple doubles : 12.4 23.4

使用Boost program_options控制程序输入的更多相关文章

  1. boost::program_options 解析命令行参数

    源码: #include <boost/program_options.hpp> namespace po = boost::program_options; int main(int a ...

  2. Boost命令行解释器的简单使用:Boost.Program_options

    简介 如果使用比较多的命令行程序的话,对于命令行参数的输入肯定不会陌生,大部分的程序都是通过类似下面的形式进行输入的,比如熟悉的ls ls --all -l --color=auto 这里面包含了三种 ...

  3. boost:program_options

    由于系统库getopt和getopt_long用起来不够直观,仔细看了下boost发现Boost.Program_options可以满足我的需求,它和getopt系列函数一样,可以抓起命令行参数,这里 ...

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

    一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...

  5. boost库中的 program_options

    1.阅读rviz中的源码时在rviz/visualizer_app.cpp中遇到如下代码: po::options_description options; options.add_options() ...

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

    介绍 程序参数项(program options)是一系列name=value对,program_options 允许程序开发者获得通过命令行(command line)和配置文件(config fi ...

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

    Boost.PropertyTree 应该是 Boost 1.41.0 开始正式加入 Boost 版本的.目前 ( 2010/02/28 ) 能下到的最新版本是 1.42.0. 主要作用/应用场合 B ...

  8. C++ 之Boost 实用工具类及简单使用

    本文将介绍几个 Boost 实用工具类,包括 tuple.static_assert.pool.random 和 program_options等等.需要对标准 STL 具备一定的了解才能充分理解本文 ...

  9. boost开发指南

    C++确实很复杂,神一样的0x不知道能否使C++变得纯粹和干爽? boost很复杂,感觉某些地方有过度设计和太过于就事论事的嫌疑,对实际开发工作的考虑太过于理想化.学习boost本身就是一个复杂度,有 ...

随机推荐

  1. 个人网站建设(适合Java初学者)(一)

    概述 作为一个在八本学校在校生,没有实验室,也没有项目可做.一直想做一个个人博客,一年前学完javaweb之后做了一个简单的博客,ui惨不忍睹就算了,还有各种bug.酝酿了很久,寒假用了将近一个月时间 ...

  2. Python的字典和JSON

    Python的字典和JSON在表现形式上非常相似 #这是Python中的一个字典 dic = { 'str': 'this is a string', 'list': [1, 2, 'a', 'b'] ...

  3. Spring源码情操陶冶-任务定时器ConcurrentTaskScheduler

    承接前文Spring源码情操陶冶#task:scheduled-tasks解析器,本文在前文的基础上讲解单核心线程线程池的工作原理 应用附例 承接前文的例子,如下 <!--define bean ...

  4. OpenGL 背面剔除

    在OpenGL种可使用glEnable(GL_CULL_FACE)开启背面剔除功能,即把那些我们看不见的面删除.但在剔除之前我们需要定义正面和背面,这个可以用法线来理解.在数学学科中,法线是用右手法则 ...

  5. HTML笔记04---计时事件

    JavaScript运动01 计时事件 1.语法:var t=setTimeout("javascript语句",毫秒); setTimeout() 方法会返回某个值.在上面的语句 ...

  6. 妙用 scale 与 transfrom-origin,精准控制动画方向

    上次发完 不可思议的纯 CSS 导航栏下划线跟随效果 这篇文章之后,很多朋友找我讨论,感叹 CSS 的奇妙. 然后昨天,群里一位朋友问到了一个和这个效果比较类似的效果,问如何 将下面这个动画的下划线效 ...

  7. Mysql之视图的操作

    视图的操作: 1.视图的创建: create view view_name as 查询语句; 2.视图的查看: show tables;// 显示所有的表和视图 show create view vi ...

  8. JavaScript根据经纬度获取距离信息

    最近开发微信小程序,遇到了外卖配送半径的问题,在网上查阅了诸多资料,也大概理解了经纬度距离计算的公式原理,在此做下笔记,方便自己和大家学习使用. 若是把地球当作一个正常的球体(其实它是椭球)来说,球面 ...

  9. 教你从手机中提取system镜像制作线刷救砖包的简单方法

    其实在制作刷机包的过程中,有时候没有官方或者第三方提供的救砖包(线刷),那怎么办?常规的方法有两种:(此处为常规方法,回读的方式暂不说明)     1.卡刷包转线刷包     2.dd命令导出分区镜像 ...

  10. [Codeforces 946G]Almost Increasing Array

    Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) .现在准许你删除任意一个数,删除之后需要修改最小的次数使序列单调递增.问最小次数. \(1\leq n\leq 200 ...