自定义可拓展Variant参数类型

一、参数对外接口的使用

	ParamPtr CCirclePtr = ParamManager::createParam(EParamType::CIRCLE);	//工厂函数
	ParamPtr xPtr;
	CCirclePtr->getSubParam(center + "." + ptX, xPtr);						//获取子参数对象
	std::cout << xPtr->toDouble() << std::endl;								//获取参数值

	ParamPtr dPtr= ParamManager::createParam(EParamType::DOUBLE);
	dPtr->setValue(6.3);													//设置参数
	CCirclePtr->setSubParam(radius, dPtr);									//修改子节点值
	ParamPtr crPtr;
	CCirclePtr->getSubParam(radius, crPtr);
	std::cout << crPtr->toDouble() << std::endl;
	
	std::list<std::string> paramNameList;
	CCirclePtr->getSubParamNameList(paramNameList);							//获取本级子参数名列表(不包含子级的子级)
	for (const auto& itr : paramNameList)
	{
		std::cout << itr << std::endl;
	}

	std::list<ParamPtr> paramList;
	CCirclePtr->getSubParamList(paramList);									//获取本级子参数列表
	for (const auto& itr : paramList)
	{
		std::cout << itr->type_name() << std::endl;							//获取参数类型名
	}

	paramList.clear();
	CCirclePtr->getParamListToName(center, paramList);						//获取所有类型描述为name子参数对象
	for (const auto& itr : paramList)
	{
		std::cout << itr->type_name() << std::endl;
		EParamType tp = itr->type();										//获取参数类型
		std::cout << ParamManager::getTypeName(tp) << std::endl;			//枚举类型转字符类型
	}
/*
输出:
0
6.3
center
radius
CPoint
Double
CPoint
CPoint
*/

二、对Json格式支持

std::map<std::string, std::string> strAndStrMap;
	const std::string returnJsonStr = "{\"code\":\"200\",\"data\":{\"serverProgramFullPath\":\"Hi1151SGNCV208_FTx4_S08F_M43\",\"programExcelName\":\"Hi1151SGNCV208_FTx4_S08F_M43\",\"flowName\":\"LT_CPA_B10\",\"channelMap\":\"ChannelMap\",\"partType\":\"Hi1151SGNCV208\",\"familyId\":\"35021226\",\"lotId\":\"VTQU7XXXX\",\"testTemperature\":\"25\",\"subLotId\":\"A01124M005\",\"customerCode\":\"A01\",\"status\":\"1\",\"testerId\":\"D9KF-010\",\"testTYPE\":\"S08\",\"tester_softver\":\"D9000-0.5.2.4(B)\",\"tester_step\":\"FT1\",\"handlerType\":\"Handler_C6_GPIB\",\"facilityId\":\"MGS\",\"userText\":\"LSL_MGS\",\"setupid\":\"FT1\",\"handlerId\":\"C68H-006\",\"handlerName\":\"QFN_1151SGNCV208_9X9_2X2_FT1_V1\",\"loadBoard\":\"LB-A01-020\",\"PGMmd5\":\"PGMmd5\",\"NonRetestBin\":\"5,6\",\"TestProgram\":\"Hi1151SGNCV208_FTx4_S08F_M43\",\"ProbeCardID\":\"\",\"GROSSDIE\":\"\",\"changeKit\":\"CK-A01-026\"}}";
	std::cout << returnJsonStr << std::endl;

	//根据参数对象描述来创建参数(Json格式)
	ParamPtr ParamItem = ParamManager::jsonStrToParamItem(returnJsonStr);
	std::cout << ParamManager::paramItemToJsonStr(ParamItem) << std::endl;

输出:
大胡子的艾娃

三、对XML格式的支持

//将参数对象解析成描述(XML节点格式)
	const std::string returnXMLStr = ParamManager::paramToStr(ParamItem);
	const std::string filePath = "tmp.xml";
	std::fstream out;
	out.open(filePath.c_str(), std::ios::_Noreplace | std::ios::out);
	out << "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
	out << returnXMLStr;
	out.clear();
	out.close();

	//tmp.xml文件格式化,并保存
	TiXmlDocument pDoc;
	pDoc.LoadFile(filePath.c_str());
	pDoc.SaveFile();

大胡子的艾娃

四、类型支持可拓展

1、可添加自定义类型

// 参数类型定义(组序不可变)
enum EParamType
{
	INVALID_TYPE,					// 无效类型

	/*************************普通类型Begin**********************/
	BOOL,							// Bool
	CHAR,							// Cahr
	INT,							// Int
	DOUBLE,							// Double
	STRING,							// String
	/*************************普通类型End************************/

	/*************************容器类型Begin**********************/
	INT_MAP,						// map<int, IParam>
	STRING_MAP,						// map<string, IParam>
	LIST,							// list<IParam>
	VECTOR,							// vector<IParam>
	/*************************容器类型End************************/

	/*************************结构体Begin************************/
	STRUCT_TYPE_FLAG,				//仅仅用于标记结构体,枚举值比其大则为结构体
	POINT,							//CPoint
	CIRCLE							//CCircle
	/*************************结构体End**************************/
};

2、自定义类型需要添加继承

/**
* @brief 点(double)
*/
class CPoint : public CVariant
{
public:
	CPoint(const EParamType& paramType, const int& flag);
	virtual ~CPoint() {}
};

/**
* @brief 圆
*/
class CCircle : public CVariant
{
public:
	CCircle(const EParamType& paramType, const int& flag);
	virtual ~CCircle() {}
};

五、该类型可作为接口的参数

1、只有工厂函数,不直接使用抽象类对象或指针,不用关心起内存问题。

ParamPtr CCirclePtr = ParamManager::createParam(EParamType::CIRCLE);	//工厂函数

2、接口参数类型为ParamPtr ,具有高度的抽象性。
3、设置参数(setValue)和获取参数值(toDouble,toString等)接口都会对类型检查,设置参数检查到类型不一致会返回false,而则会断言。

VS2017工程源码下载:https://download.csdn.net/download/qq_43148810/21031044

相关文章推荐:
C++17 any类(万能容器)详解
initialize(initialize_list<T>)
c++11 Variadic Templates(…)(可变参数列表)
元组tuple
C++17之std::variant
C++17:std::any, std::variant 和 std::optional
Qt之QVariant用法
QVariant的用法

如有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大胡子的艾娃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值