boost库时c++常用的工具库,地位仅次于c++标准库,在工作中发现Boost库其实是有许多封装好的实用功能库,这里写篇笔记进行记录下,方便后面自己查阅使用

一,program_options实现终端命令行参数解析

在使用linux终端时会发现有许多命令行都有-h功能比如:

man -h

C++ Boost库使用笔记_命令行


有这样一个需求,需要写一个小工具,并且小工具的接收参数可变,方便其他程序进行调用,这里我们可以通过main 函数的argc与argv接收可执行程序后面的参数,接着进行字符拆分(拆分’-’)从而判断各个参数。

但是如果选项非常多,都通过拆分得到的话未免也有点太蠢了,并且过了一段时间我自己都会忘记每个选项的含义,因此这里可以通过boost::program_options进行管理

首先cmakelist导入boost库:

find_package(Boost 1.65.1 REQUIRED system filesystem thread program_options)
include_directories(
${Boost_INCLUDE_DIRS}
)
target_link_libraries(
${Boost_LIBRARIES}
)

使用如下代码,具体代码中有注释,就不再一行行解析:

#include <iostream>

#include "boost/program_options.hpp"
//重命名命名空间
namespace bpo = boost::program_options;
int main(int argc, char** argv) {
//构建选项器名称
bpo::options_description opts("all options");
//选项存储器,继承自map容器
bpo::variables_map vm;
std::string input_name = "";
std::string output_name = "";
int mode = 0;
//步骤二: 为选项描述器增加选项
//其参数依次为: key, value的类型,该选项的描述
// //参数会传入引用类型,有对应输入选项后会更改传入的变量值
opts.add_options()("mode,m", bpo::value<int>(&mode)->default_value(mode),
"模式")(
"input,i",
bpo::value<std::string>(&input_name)->default_value(input_name),
"老配置文件位置")(
"output,o",
bpo::value<std::string>(&output_name)->default_value(output_name),
"新配置文件位置")("help,h", "帮助文档");

//步骤三: 先对命令行输入的参数做解析,而后将其存入选项存储器
//如果输入了未定义的选项,程序会抛出异常,所以对解析代码要用try-catch块包围
try {
// parse_command_line()对输入的选项做解析
// store()将解析后的结果存入选项存储器
bpo::store(bpo::parse_command_line(argc, argv, opts), vm);
} catch (...) {
std::cout << "输入的参数中存在未定义的选项!\n";
return 0;
}
bpo::notify(vm);
if (vm.count("help")) { //若参数中有help选项
// options_description对象支持流输出, 会自动打印所有的选项信息
std::cout << opts << std::endl;
return 0;
}
if (vm.empty()) {
std::cout << "no options found \n";
return 1;
}
std::cout << input_name << std::endl;
}

编译后运行,可执行程序 -h则会输出所有的选项以及选项中设置的说明文档

C++ Boost库使用笔记_命令行_02


加上对应的选项,则会将传入的对应选项变量值进行改变:

C++ Boost库使用笔记_命令行_03