【C++】开源:命令行解析库CLI11配置与使用

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍命令行解析库CLI11配置与使用。
无专精则不能成,无涉猎则不能通。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 项目介绍
    • :blush:2. 环境配置
    • :satisfied:3. 使用说明

😏1. 项目介绍

项目Github地址:https://github.com/CLIUtils/CLI11

看到一位朋友的评论,说平时命令行解析库用CLI11的多,这里来学习一下。

CLI11 是一个用于处理命令行参数和选项的 C++ 库,旨在简化 C++ 应用程序的命令行界面开发。

主要特点:

1.简单易用:CLI11 的设计目标之一是提供一个简单且直观的 API,使开发者能够轻松地定义和解析命令行选项。

2.现代 C++ 支持:CLI11 充分利用了现代 C++ 的特性,包括类型推导、lambda 表达式等,使其在语法上更为优雅和灵活。

3.丰富的选项支持:支持多种命令行选项,包括标志选项(flags)、位置参数、可选参数、必选参数等,可以方便地定义各种复杂的命令行接口。

4.类型安全:CLI11 在解析和处理命令行参数时,提供了类型安全的机制,避免了常见的类型转换错误。

5.灵活的错误处理:提供了多种错误处理方式,包括参数验证失败时的错误提示、帮助信息的自动生成等。

6.跨平台支持:CLI11 可以在主流的操作系统上运行,包括 Windows、macOS 和各种 Linux 发行版,确保了跨平台的兼容性。

😊2. 环境配置

ubuntu源码安装CLI11库:

git clone https://github.com/CLIUtils/CLI11.git
mkdir build & cd build
cmake ..
make
sudo make install

程序g++编译(不用加-lCLI11):g++ -o main main.cpp

😆3. 使用说明

下面是一个解析命令行的示例:

#include <CLI/CLI.hpp>
#include <iostream>int main(int argc, char **argv) {CLI::App app{"CLI11 example"};std::string name;app.add_option("-n,--name", name, "Your name")->required();CLI11_PARSE(app, argc, argv);std::cout << "Hello, " << name << "!" << std::endl;return 0;
}

官方还给出了一些示例,如通过命令行检查(如文件、数字范围):

// Copyright (c) 2017-2024, University of Cincinnati, developed by Henry Schreiner
// under NSF AWARD 1414736 and by the respective contributors.
// All rights reserved.
//
// SPDX-License-Identifier: BSD-3-Clause#include <CLI/CLI.hpp>
#include <iostream>
#include <string>int main(int argc, char **argv) {CLI::App app("Validator checker");std::string file;app.add_option("-f,--file,file", file, "File name")->check(CLI::ExistingFile);int count{0};app.add_option("-v,--value", count, "Value in range")->check(CLI::Range(3, 6));CLI11_PARSE(app, argc, argv);return 0;
}

此外还可以和json库一起使用:

// Copyright (c) 2017-2021, University of Cincinnati, developed by Henry Schreiner
// under NSF AWARD 1414736 and by the respective contributors.
// All rights reserved.
//
// SPDX-License-Identifier: BSD-3-Clause#include <CLI/CLI.hpp>
#include <iostream>
#include <memory>
#include <nlohmann/json.hpp>
#include <string>
#include <vector>// This example is only built on GCC 7 on Travis due to mismatch in stdlib
// for clang (CLI11 is forgiving about mismatches, json.hpp is not)using nlohmann::json;class ConfigJSON : public CLI::Config {public:std::string to_config(const CLI::App *app, bool default_also, bool, std::string) const override {json j;for(const CLI::Option *opt : app->get_options({})) {// Only process option with a long-name and configurableif(!opt->get_lnames().empty() && opt->get_configurable()) {std::string name = opt->get_lnames()[0];// Non-flagsif(opt->get_type_size() != 0) {// If the option was found on command lineif(opt->count() == 1)j[name] = opt->results().at(0);else if(opt->count() > 1)j[name] = opt->results();// If the option has a default and is requested by optional argumentelse if(default_also && !opt->get_default_str().empty())j[name] = opt->get_default_str();// Flag, one passed} else if(opt->count() == 1) {j[name] = true;// Flag, multiple passed} else if(opt->count() > 1) {j[name] = opt->count();// Flag, not present} else if(opt->count() == 0 && default_also) {j[name] = false;}}}for(const CLI::App *subcom : app->get_subcommands({}))j[subcom->get_name()] = json(to_config(subcom, default_also, false, ""));return j.dump(4);}std::vector<CLI::ConfigItem> from_config(std::istream &input) const override {json j;input >> j;return _from_config(j);}std::vector<CLI::ConfigItem>_from_config(json j, std::string name = "", std::vector<std::string> prefix = {}) const {std::vector<CLI::ConfigItem> results;if(j.is_object()) {for(json::iterator item = j.begin(); item != j.end(); ++item) {auto copy_prefix = prefix;if(!name.empty())copy_prefix.push_back(name);auto sub_results = _from_config(*item, item.key(), copy_prefix);results.insert(results.end(), sub_results.begin(), sub_results.end());}} else if(!name.empty()) {results.emplace_back();CLI::ConfigItem &res = results.back();res.name = name;res.parents = prefix;if(j.is_boolean()) {res.inputs = {j.get<bool>() ? "true" : "false"};} else if(j.is_number()) {std::stringstream ss;ss << j.get<double>();res.inputs = {ss.str()};} else if(j.is_string()) {res.inputs = {j.get<std::string>()};} else if(j.is_array()) {for(std::string ival : j)res.inputs.push_back(ival);} else {throw CLI::ConversionError("Failed to convert " + name);}} else {throw CLI::ConversionError("You must make all top level values objects in json!");}return results;}
};int main(int argc, char **argv) {CLI::App app;app.config_formatter(std::make_shared<ConfigJSON>());int item;app.add_flag("--simple");app.add_option("--item", item);app.set_config("--config");CLI11_PARSE(app, argc, argv);std::cout << app.config_to_str(true, true) << std::endl;
}

在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/865718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ETCD概述--使用/特性/架构/原理

ETCD概述 ETCD是一个高度一致的分布式键值存储, 它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据(高可用, 强一致性)​全局的配置服务中心. 本文将介绍其特性、相关操作和常见的应用场景. 如果想了解更多, 请查阅我的技术博客: https://dingyuqi.com 特性 …

开启IT探索之旅:高考后的暑期学习指南

方向一&#xff1a;基础课程预习指南 1. 计算机科学导论 这门课程是所有IT专业的基础&#xff0c;它将带你了解计算机的基本原理、发展历史及计算机科学的主要研究领域。可以通过以下资源进行学习&#xff1a; 书籍&#xff1a;《计算机科学概论》 by Brookshear在线课程&#…

python 使用selenium谷歌如何设置无头模式

在使用Selenium和ChromeDriver时&#xff0c;如果你想要在Python中设置无头模式&#xff08;headless mode&#xff09;&#xff0c;你需要在创建Chrome WebDriver实例时通过ChromeOptions来设置。无头模式允许你在没有图形界面的环境中运行Chrome浏览器&#xff0c;这在进行自…

(单片机)

一、串口 (Serial Port / UART) 串口(Serial Port)、IC(Inter-Integrated Circuit)、SPI(Serial Peripheral Interface)是三种常用的微控制器之间的通信协议。下面我将分别解释这些通信方式的概念、特点和常见使用场景,并提供一个简单的示例代码框架。 串口 (Serial P…

frp http转发

解决HTTP协议API中域名变更后,已部署设备无法数据上传问题 HTTP协议API中包含域名 通过http://api_domain.com/xxx/xxx/xxx/xxx上传数据到WEB服务器。 变更前 api_domain.com 绑定在2xx.xxx.xxx.xxx上面。2xx.xxx.xxx.xxx部署了需要访问的WEB服务。 变更后 new_domain.c…

新章节:全设备通用调度算法-通讯重构

新章节&#xff1a;全设备通用调度算法-通讯重构 文章目录 新章节&#xff1a;全设备通用调度算法-通讯重构前言一、重构了TCP和UDP通讯二、优化了OPC和OPCUA三、升级了监控客户端四、升级了通讯的图形化其他升级 前言 现在真的很懒也很少写代码了&#xff0c;写代码和更新进度…

ActiViz中的颜色映射表vtkLookupTable

文章目录 一、简介二、VtkLookupTable的创建与初始化三、设置数据范围四、颜色映射设置五、不透明度设置六、自定义颜色映射七、 不连续性颜色映射八、 预设颜色映射方案九、可视化效果优化十、与其他VTK组件的整合十一、 动态调整映射表十二、保存和加载颜色映射表一、简介 V…

数据赋能(137)——开发:数据映射——实施过程、应用特点

实施过程 数据映射的实施过程通常涉及以下几个关键步骤&#xff1a; 定义阶段&#xff1a; 明确需要移动或映射的数据&#xff0c;包括源数据和目标数据的格式、结构以及传输频率。定义表格、每个表格中的字段&#xff0c;以及移动后字段的格式。映射数据阶段&#xff1a; 将…

webSocket网页通信---使用js模拟多页面实时通信

webSocket是什么 WebSocket是一种先进的网络技术&#xff0c;它提供了一种在单个TCP连接上进行全双工通信的能力。传统的基于HTTP的通信是单向的&#xff0c;即客户端发起请求&#xff0c;服务器响应请求&#xff0c;然后连接关闭。但是&#xff0c;WebSocket允许服务器和客户端…

欧盟,又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理?

欧盟&#xff0c;又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理&#xff1f; 欧盟新规委员会发布《通用充电器指令》指南通用充電器的 RED 修正案办理流程&#xff1a; 2024年5月7日&#xff0c;欧盟委员会发布《通用充电器指令》指南&#xff0c;修订了《无线…

Linux之进程控制(下)

目录 进程替换的概念 进程替换的函数 execl​编辑 execlp execle execv execvp execve 上期&#xff0c;我们学习了进程创建&#xff0c;进程终止和进程等待&#xff0c;今天我们要学习的是进程控制中相对重要的板块------进程替换。 进程替换的概念 在进程创建时&…

【 香橙派 AIpro评测】大语言模型实战教程:香橙派 AIpro部署LLMS大模型实站(保姆级教学)

引言 OrangePi AIpro 这块板子作为业界首款基于昇腾深度研发的AI开发板&#xff0c;一经发布本博主就火速去关注了&#xff0c;其配备的 8/20TOPS澎湃算力是目前开发板市场中所具备的最大算力&#xff0c;可谓是让我非常眼馋啊&#xff01;这么好的板子那必须拿来用用&#xff…

LeetCode热题100刷题6:160. 相交链表、206. 反转链表、234. 回文链表、141. 环形链表、142. 环形链表 II

160. 相交链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode…

QDockWidget类详解

一.QDockWidget类概述 1.QDockWidget类 QDockWidget类提供了一个特殊的窗口部件&#xff0c;它可以是被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。 QDockWidget类提供了dock widget的概念&#xff0c;dock widget也就是我们熟悉的工具面板或者是工具窗口。Do…

nginx转发的问题

我在项目配置的时候遇到一个问题&#xff1a; 配置了域名转发&#xff0c;且配置了https nginx配置如下&#xff1a; server {listen 443 ssl;server_name yourdomain.com;ssl_certificate /path/to/your/certificate.crt;ssl_certificate_key /path/to/your/private.key;loca…

10.SQL注入-http header利用案例

SQL注入-http header利用案例 首先通过登录http头界面,如图所示:登录的信息会被记录到数据库中去&#xff0c;同时使用bp进行抓包分析 将抓包的数据发送repeater里面进行调试 通过useragent进行注入 将useragent对应的数据信息删除掉,输入单引号测试被后台执行报错sql语法…

【Python机器学习】模型评估与改进——带交叉验证的网格搜索

虽然将数据划分为训练集、验证集、测试集的方法是可行的&#xff0c;也相对常用&#xff0c;但这种方法对数据的划分相当敏感&#xff0c;为了得到对泛化性能的更好估计&#xff0c;我们可以使用交叉验证来评估每种参数组合的性能&#xff0c;而不是仅将数据单次划分为训练集与…

为什么要在成像应用中使用图像采集卡?

达到最大产量是工业和工厂自动化的关键标准之一。提高传感器分辨率和帧速率有助于实现这一目标&#xff0c;但也使带宽达到极限&#xff0c;并提出了新的传输问题。当前高带宽接口(如10GigE、相机直接与PC连接和嵌入式系统)的实现促使成像应用的许多用户询问如何以最佳配置最优…

vue3进阶,渲染函数使用

目录 渲染函数使用场景 h() 渲染函数 渲染函数基础写法 渲染函数的组件传参&#xff0c;事件传递 渲染函数的插槽使用 结语 渲染函数使用场景 在写这篇文章之前&#xff0c;我会先简单说一下渲染函数&#xff0c;并且我会在第一个渲染函数的介绍中&#xff0c;标名渲染函数…

[Go 微服务] Kratos 验证码业务

文章目录 1.环境准备2.验证码服务2.1 kratos 初始化验证码服务项目2.2 使用 Protobuf 定义验证码生成接口2.3 业务逻辑代码实现 1.环境准备 protoc和protoc-gen-go插件安装和kratos工具安装 protoc下载 下载二进制文件&#xff1a;https://github.com/protocolbuffers/protobu…