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

4 篇文章 0 订阅

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

下面贴上源码,其中有个接口需要自己实现,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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值