C++:每天一个挨打小技巧-利用模板做一个高可用的windows命令行解析接口(续)

2024-03-27 20:38

本文主要是介绍C++:每天一个挨打小技巧-利用模板做一个高可用的windows命令行解析接口(续),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天继续来增加挨打技巧,前面写到的一个命令行解析其实可以更狠一点,可以支持所有基本类型的入参解析(后续读者需要新增自定义类型的话也可以自己拓展)

下面贴上源码,其中有个接口需要自己实现,CStringUtil::split就是分隔字符串里面内容的。

#pragma once #include <deque>
#include <typeindex>#include "string_util.h"class CmdHepler{
public:template<typename ...Args>static void get_cmd(IN OUT std::tuple<Args...>& tup) {//解析字符串std::deque<std::string> param_ = CStringUtil::split<std::remove_reference<decltype(param_)>::type>(W2A_(GetCommandLine())," ");//第0个参数是exe本身param_.pop_front();parse_cmd(param_,tup);}
private://类型转换接口template<typename T>static typename std::enable_if<std::is_same<std::string,typename std::decay<T>::type>::value,void>::type translate(OUT T& out,IN const std::string& in) {out = in;}template<typename T>static typename std::enable_if<std::is_same<int,typename std::decay<T>::type>::value, void>::type translate(OUT T& out, IN const std::string& in) {out = std::atoi(in.c_str());}template<typename T>static typename std::enable_if<std::is_same<long, typename std::decay<T>::type>::value, void>::type translate(OUT T& out, IN const std::string& in) {out = std::atol(in.c_str());}template<typename T>static typename std::enable_if<std::is_same<long long, typename std::decay<T>::type>::value, void>::type translate(OUT T& out, IN const std::string& in) {out = std::atoll(in.c_str());}template<typename T>static typename std::enable_if<std::is_same<double, typename std::decay<T>::type>::value, void>::type translate(OUT T& out, IN const std::string& in) {out = std::atof(in.c_str());}//template <size_t I = 0, typename Tup>static typename std::enable_if < I < std::tuple_size<Tup>::value>::type get_cmd(IN std::deque<std::string>& cmd, OUT Tup& tup) {translate(std::get<I>(tup),cmd.at(I));get_cmd<I + 1>(cmd, tup);}template <size_t I = 0, typename Tup>static typename std::enable_if< I == std::tuple_size<Tup>::value>::type get_cmd(IN std::deque<std::string>& cmd, OUT Tup& tup) {//do nothing}template <typename ...Args>static void parse_cmd(IN std::deque<std::string>& cmd, OUT std::tuple<Args...>& tup) {if (std::tuple_size<std::tuple<Args...>>::value != cmd.size()) {throw std::exception("命令行参数不符合要求!");}get_cmd(cmd,tup);}
};

具体调用方法如下:

auto tup = std::make_tuple<int, std::string, int, std::string>(0,"",0,"");
CmdHepler::get_cmd(tup);

这篇关于C++:每天一个挨打小技巧-利用模板做一个高可用的windows命令行解析接口(续)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853319

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监