一个参数处理类

在最近的项目中,使用的插件式架构, 插件的每个功能都需要用户输入的参数(所需的参数值配置在xml文件中),之前的做法是将每个功能需要的所有参数定义成结构体
程序一开始,解析XML文件,将对应名称的参数值填充到相应的字段中。如果参数个数很多,则参数结构体的字段就会很多,写起来就会很麻烦,而且当
某个模块新增参数时(在xml文件中添加),就必须修改参数结构体,不利于程序扩展。
所以写了一个下面的参数类,将xml中所有参数按 参数名(string) 参数值(string)键值对的形式存储到map中,当需要某个参数时,按参数名称
提取即可(且不区分参数名的大小写),使用者自己控制将参数解析成什么形式(整型,浮点型等) ,而且新增某个参数时,只需在xml按照一定的规则添加即可(参数名 参数值),不需要修改参数类。用的时候直接按名称提取即可。

记录如下:

参数配置XML文件格式简化为:

<Params>
<Item Name="NetWorkType" Value="UMTS"></Item>
<Item Name="GridCntThreshold" Value="100"></Item>
</Params>

参数类如下:

param.h

#ifndef PARAM_H_
#define PARAM_H_
#include <map>
#include <string>
#include <algorithm>
#include <sstream>

using std::map;
using std::string;
using std::stringstream;

//参数类
class CParam
{
public:
	struct NoCaseCompare
	{
		bool operator()(const string & str1, const string & str2)
		{
			string upper_str1(str1);
			string upper_str2(str2);
			std::transform(upper_str1.begin(),upper_str1.end(),upper_str1.begin(),toupper);
			std::transform(upper_str2.begin(),upper_str2.end(),upper_str2.begin(),toupper);
			return upper_str1.compare(upper_str2) >= 0 ? false : true;
		}
	};

	typedef map<string,string,NoCaseCompare> StrMap;

	CParam();
	virtual ~CParam();
	//设置参数值
	template <typename T>
	void SetParam(const string & param_name, const T & param_val);

	//得到double型参数
	double GetParamDouble(const string & param_name);
	//得到整型参数值
	int GetParamInt(const string & param_name);
	//得到字符串参数值
	string GetParamString(const string & param_name);
	//得到bool型参数值
	bool GetParamBool(const string & param_name);

	//加载参数配置文件,将所有参数按 参数名(string)-> 值(string) 的形式存储
	bool LoadParamXml(const string & param_file_path);
	//清除所有参数
	void Clear();

private:
	const char* FindParam(const string & param_name);

private:
	StrMap _params;
};

template <typename T>
void CParam::SetParam(const string & param_name, const T & param_val)
{
	stringstream ss;
	ss << param_val;
	_params[param_name] = ss.str();

}
#endif

param.cpp

#define TIXML_USE_STL
#include "param.h"
#include <tinyxml.h>

CParam::CParam()
{

}

CParam::~CParam()
{

}

double CParam::GetParamDouble( const string & param_name )
{
	double val = 0;
	const char * pStr = this->FindParam(param_name);
	if (NULL != pStr)
	{
		val = atof(pStr);
	}
	return val;
}

const char * CParam::FindParam(const string & param_name)
{
	StrMap::const_iterator it = _params.find(param_name);
	if (it != _params.end())
	{
		return it->second.c_str();
	}
	return NULL;

}

int CParam::GetParamInt( const string & param_name )
{
	int val = 0;
	const char * pStr = FindParam(param_name);
	if (NULL != pStr)
	{
		val = atoi(pStr);
	}
	return val;
}

string CParam::GetParamString( const string & param_name )
{
	StrMap::const_iterator it = _params.find(param_name);
	if (it != _params.end())
	{
		return it->second;
	}
	return "";
}

bool CParam::GetParamBool( const string & param_name )
{
	bool val = false;
	const char * pStr = FindParam(param_name);
	if (NULL != pStr)
	{
		string str(pStr);
		std::transform(str.begin(),str.end(),str.begin(),tolower);
		if (str == "t" || str == "true" || atoi(str.c_str()) > 0)
		{
			val = true;
		}
	}
	return val;
}

bool CParam::LoadParamXml( const string & param_file_path )
{
	//从参数 配置文件中读取所有参数
	TiXmlDocument doc;
	if (!doc.LoadFile(param_file_path))
	{
		return false;
	}
	TiXmlHandle handle(&doc);
	TiXmlElement *pChild = handle.FirstChild("Params").FirstChild("Item").Element();
	for (; NULL != pChild; pChild = pChild->NextSiblingElement())
	{
		string name;
		string val;
		pChild->QueryStringAttribute("Name",&name);
		pChild->QueryStringAttribute("Value",&val);
		this->SetParam(name,val);
	}
	return true;
}

void CParam::Clear()
{
	_params.clear();
}

测试代码如下:

CParam param;
param.LoadParamXml("d:\\TEST\\Param.xml");
cout << param.GetParamDouble("GridCntThreshold") << endl;
cout << param.GetParamString("NETWORKTYPE") << endl;
时间: 2024-08-04 05:47:53

一个参数处理类的相关文章

作为类的成员函数,重载运算符只能有一个参数

1 overload a operator of a class, you can only use one para., this pointer is automatically used. class Rational { public: //not correct since this ponit would be used automatically. //Rational operator+ (const Rational& lhs, const Rational& rhs);

一个简单的参数校验类

当我们写js的重载函数的时候,我们需要判断不同的输入情况. 而,一般我们是根据参数的个数来判断的,但是,常常情况并非如此: function abc(a,b,c) a:string b:number c:boolean 或者 a:string b:string c:number 这两种情况都是参数个数为3,但是参数类型却完全不同.如何的方便的构建一个重载函数呢? 用我的类即可: 类代码(很简短): var Param = { varify: function (oParam, sParamTyp

7. 反射技术:其实就是动态加载一个指定的类

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.

调用enqueue执行异步请求有一个参数设置回调。

前面的内容介绍了OkHttp,本章就来教大家okhttp的基本使用,学了这些基本东西之后,大家有其他的需求可以自行扩展.以下的所有请求都是异步请求服务器,在真实的企业开发中,基本都是异步. 首先创建一个request对象,通过request设置请求url,通过这个类还可以设置更多的请求信息.然后通过Request去构造一个Call对象. 调用enqueue执行异步请求,有一个参数设置回调.请求成功或者失败会调用Callback接口的onResponse跟onFailure方法,因为这是异步请求,

视频iOS之02第一个OC的类

OC是一门面向对象的语言,因此它也有类.对象.静态\动态方法.成员变量的概念.这讲就来创建第一个OC的类. 第一个类的源码: 1 /* 2 人 3 类名:Person 4 属性(成员变量\实例变量):体重.年龄 5 行为(方法):走路.吃 6 */ 7 8 #import <Foundation/Foundation.h> 9 10 //1.类的声明 11 @interface Person : NSObject 12 { 13 @public 14 int age; 15 double we

刚整了一个数据库操作类,但是可以用吗?

今天闲来无事,把以前自己搞的一个数据库操作类重新整理了一下,把命名规范了一下,位置和功能重新规划了一下. 源代码下载:http://files.cnblogs.com/xiaoshuai1992/xsFrameWork.SqlServer.zip 请先看图片和介绍 DbOperate文件夹 DbAccess类:核心类,运用Ado.net 对数据库进行操作. DbInParameter :传入DbAccess的参数,如参数,sql语句,sp名称,sp是执行还是返回数据. DbOutParamete

Coding之路——重新学习C++(4):定义一个正确的类

我们都能定义一个类,可是如何定义一个正确的类,这是一个需要我们深入理解的问题.C++之父曾经说过定义新类型的基本思想就是将实现一个类的时候并非必要的细节(存储该类型的对象采用的布局细节)和对于这个类的正确使用至关重要的性质(访问数据的成员函数)分开设计.这种区分的最好实现方式是提供一个特定的表层接口,所有对于类内部数据结构和内部维护的调用都通过这个表层接口. 1.类该怎么定义 (1)首先我们要明白,建立一个对象,构造函数把成员变量都放在了堆之中(除了static变量之外,static变量放在全局

第一个OC的类

[转自]http://www.cnblogs.com/mjios/archive/2013/04/06/3002814.html 本文目录 一.语法简介 二.用Xcode创建第一个OC的类 三.第一个类的代码解析 四.添加成员变量 五.添加方法 六.跟Java的比较 七.创建对象 八.访问公共成员变量和方法 说明:这个Objective-C专题,是学习iOS开发的前奏,也为了让有面向对象语言开发经验的程序员,能够快速上手Objective-C.如果你还没有编程经验,或者对Objective-C.

一个数据库操作类,适用于Oracle,ACCESS,SQLSERVER

最近做了一个数据诊断的项目,里面自己写了一个数据库的操作类,包含:连接数据库.读数据表.执行SQL操作,释放数据库等组成,希望对大家有用,由于水平有限,若有错误或者代码不足地方欢迎指正,谢谢. ADOOperate.H [cpp] view plaincopy ////////////////////////////////////////////////////////////////////// // 类功能:用于数据库的操作 主要实现 连接数据库 读数据表 检查数据表 执行SQL语句 //