一、参数对外接口的使用
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