stringparser.h

来自「基于stl使用的扩展,方便的把字符串转成任意类型」· C头文件 代码 · 共 107 行

H
107
字号
#pragma once

#include <boost/lexical_cast.hpp>
#include <objbase.h>


namespace stringparser
{
	template <class T> 
	inline 
	bool Parse(LPCWSTR sz, T* pv)
	{
		if (sz == NULL)
			return false;
		try
			{ *pv = boost::lexical_cast<T>(sz); }
		catch(boost::bad_lexical_cast &)
			{ return false; }
		return true;
	}

	template <>
	inline 
	bool Parse(LPCWSTR sz, INT64* pv)
	{
		if (sz[0] == 0)
			return false;
		WCHAR* pEnd = (WCHAR*)sz;
		UINT64 ret = _wcstoi64(sz, &pEnd, 10);
		if (pEnd == sz)
			return false;
		*pv = ret;
		return true;
	}
	template <>
	inline 
	bool Parse(LPCWSTR sz, UINT64* pv)
	{
		if (sz[0] == 0)
			return false;
		WCHAR* pEnd = (WCHAR*)sz;
		UINT64 ret = _wcstoui64(sz, &pEnd, 10);
		if (pEnd == sz)
			return false;
		*pv = ret;
		return true;
	}
	template <>
	inline 
	bool Parse(LPCWSTR sz, LPCWSTR* pv)
	{
		*pv = sz;
		return true;
	}
	template <>
	inline 
	bool Parse(LPCWSTR sz, std::wstring* pv)
	{
		if (sz == NULL)
			pv->clear();
		else
			pv->assign(sz);
		return true;
	}
	template <>
	inline 
	bool Parse(LPCWSTR sz, bool* pv)
	{
		if (sz == NULL)
			return false;
		if (wcsicmp(sz, L"false") == 0)
			*pv = false;
		else if (wcsicmp(sz, L"true") == 0)
			*pv = true;
		else
			return false;
		return true;
	}
	template <>
	inline 
	bool Parse(LPCWSTR sz, GUID* pv)
	{
		if (sz == NULL)
			return false;
		GUID v;
		if (FAILED(::CLSIDFromString((LPOLESTR)sz, &v)))
			return false;
		*pv = v;
		return true;
	}


	//////////////////////////////////////////////////////////////////////////
	

	template <class T>
	inline 
	T Parse2(LPCWSTR sz, const T& defV = T())
	{
		T v;
		if (! Parse(sz, &v))
			return defV;
		return v;
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?