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

相关文章

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准