【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 特性 …

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

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

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…

探索智慧校园人事系统:社会关系管理功能全解析

智慧校园人事系统中的社会关系管理模块&#xff0c;旨在通过数字化手段&#xff0c;高效、安全地记录与管理教职工的社会联系信息&#xff0c;包括但不限于家庭成员、紧急联系人、学术合作关系、社会兼职等&#xff0c;旨在促进学校对教职工个人生活关怀及职业网络拓展的理解和…

四、(2)获取数据(补充urllib)(爬虫及数据可视化)

四、&#xff08;2&#xff09;获取数据&#xff08;补充urllib&#xff09;&#xff08;爬虫及数据可视化&#xff09; urllibget请求post请求User-AgentResponse模拟真实信息在豆瓣spider中真实实现 urllib 此处的扩展&#xff0c;可以进行在主体的程序学习完成后&#xff0…

【数据结构】04.双向链表

一、双向链表的结构 注意&#xff1a;这里的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;带头链表里的头节点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位节点不存储任何有效元素&#xff0c;只是站在这里“放哨的”。 “哨兵位”存在的意义&#xff1a;遍历循…

Roboflow自动标定数据集

最近需要自己打数据集&#xff0c;记录一下用Roboflow来打标签。 https://roboflow.com/&#xff08;官网&#xff09; 进入官网先注册&#xff0c;注册完成后进入这个界面。 我先讲如果不想让数据集公开怎么办&#xff0c;因为这里每个新建的都是公开的。新账号进去应该进去…

【数据分享】国家级旅游休闲街区数据(Excel/Shp格式/免费获取)

之前我们分享过从我国文化和旅游部官网整理的2018-2023年我国50个重点旅游城市星级饭店季度经营状况数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01;文化和旅游部官网上也分享有很多与旅游相关的常用数据&#xff0c;我们基于官网发布的名单文件整理得到全国…

Qt Creator13配置Android开发环境

QT Creator13是目前&#xff08;2024年&#xff09;最新版本&#xff0c;配置Android开发环境有一些不一样&#xff0c;走了一些弯路&#xff0c;记录如下。 1、安装JDK和SDK 下载安装JDK和SDK&#xff0c;建议安装在无空格和中文字符的目录下。 具体安装步骤不再赘述&#…