本文主要是介绍C++:每天一个挨打小技巧-利用模板做一个高可用的windows命令行解析接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在日常windows开发过程中,很多时候需要调整我们的命令行参数的个数,以下通过模板的特性,设计一个高可用的命令行解析接口。
实现:
#pragma once class CmdHepler{
public:template<typename Tup>static void get_cmd(Tup& tup) {std::vector<std::string> params;int nArgs = 0;LPWSTR *szArglist = NULL;szArglist = CommandLineToArgvW(GetCommandLine(), &nArgs);if (szArglist != nullptr && nArgs > 1) {for (int i = 1; i < nArgs; i++) {std::string cmd = W2A_(szArglist[i]);params.emplace_back(cmd);}}LocalFree(szArglist);parse_cmd(params, tup);}
private:template <size_t I = 0, typename Tup>static typename std::enable_if < I < std::tuple_size<Tup>::value>::type get_cmd(IN std::vector<std::string>& cmd, OUT Tup& tup) {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::vector<std::string>& cmd, OUT Tup& tup) {//do nothing}template <typename ...Args>static void parse_cmd(IN std::vector<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);//get_cmd(get_cmd(), tup);}
};
外部调用:
auto tup = std::make_tuple<std::string, std::string, std::string, std::string>("","","","");
CmdHepler::get_cmd(tup);
需要增加命令行参数个数时,只需要改变调用的参数即可。
这篇关于C++:每天一个挨打小技巧-利用模板做一个高可用的windows命令行解析接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!