应用场景:如何把数据库表中的一行转换成一个业务实体结构体,c#和java中都有实体框架,表到实体的转换很方便,c++中缺少这些框架,但是有一些折中的办法去做。其实问题的本质是:map如何转成结构体。

问题:map的字段和结构体字段一一对应时,如何把map中字段对应的值付给结构体中相同名称字段?

有点麻烦的地方:如何让结构体去在map中查找相应的字段值,一种办法是通过手写的办法,把每个字段名称写成常量字符串,然后去map中查找,找到后,再给该字段赋值,这个办法是可以的,但是重复性的硬编码了很多字段名称,代码也比较丑陋。

一个比较好的办法是通过一个宏和一个模板函数去赋值比较好。

这是我们的结构体
#define VarName(x) #x //字段转成名称的宏
struct TestInfo
{
int ID;
int KPIID;
int Code;
int V1;
int V2;
int V3; void Init()
{
memset(this, , sizeof(TestInfo));
} void Make(SweetDB::Row& row)
{
Init();
GetValue(row, VarName(ID), ID);
GetValue(row, VarName(KPIID), KPIID);
GetValue(row, VarName(Code), Code);
GetValue(row, VarName(V1), V1);
GetValue(row, VarName(V2), V2);
GetValue(row, VarName(V3), V3);
} void MakeToRow(SweetDB::Row& row)
{
row[VarName(ID)] = ID;
row[VarName(KPIID)] = KPIID;
} template<typename T>
static bool GetValue(SweetDB::Row& row, const char* name, T& t)
{
auto it = row.find(name);
if (it == row.end())
return false; t = get<T>(it->second); return true;
}
};

测试代码:

typedef boost::variant<double, int, string>Value;
typedef unordered_map<const char*, Value> Row;
TestInfoResult TestDoublePointer()
{
SweetDB::Row row = { {"ID", }, { "KPIID", }, { "Code", } };
TestInfo t;
t.Make(row); //把map中对应的字段值赋给t SweetDB::Row row1;
t.MakeToRow(row1); //把t的字段值赋给map
}

最后我们看到map to struct成功了,struct to map也成功了。
优点是不用硬编码字段名称,缺点是,每个字段的赋值还是要编码,这个工作量还是没省,如果是c#语言直接就通过反射搞定,不需要这么绕弯子了,c++语言就没办法,只能自己发明轮子了。也许大家还有更好的办法,可以一起探讨一下。

也许c++ ORM框架大体可以按这个思路去做吧。

最新文章

  1. 用纯css改变下拉列表select框的默认样式(不兼容IE10以下)
  2. Android Frameworks层介绍
  3. linux中模块的相关操作
  4. 第七篇、微信小程序-video组件
  5. 跟我学LFS LiveUSB制作
  6. PHP中的预定义超全局数组
  7. 利用over开窗函数取第一条记录
  8. 关于加载离线SHP文件、geodatabase文件所遇到的路径问题
  9. 实现ajax的步骤
  10. Git之(三)辅助命令
  11. 【托业】【怪兽】TEST01
  12. 【工具相关】Web-ionic-ionicLab的使用
  13. 关于ListBox在Grid中无法充满的问题
  14. idea 普通 web项目配置启动【我】
  15. 【GMT43智能液晶模块】例程五:IWDG看门狗实验——复位ARM
  16. 关于Object.prototype.toString.call
  17. 手把手教你使用“谷歌云消息服务(GCM)&quot;
  18. Bootstrap:教程、简介、环境安装
  19. js实现新闻条目滚动效果
  20. 2017-2018-1 Java小组-1623 第一周作业

热门文章

  1. Linux下grub.cnf详解
  2. 【linux】linux 环境下 安装禅道(转载) -- 跟web服务器无关,无视apache、nginx!!!
  3. Android中如何让DialogFragment全屏(DialogFragment fullscreen)
  4. ios中 radioButton和DataPIcker,九宫格封装好使用
  5. The minimum required Cuda capability is 3.7.
  6. Magento模型与ORM基础
  7. php支付宝开发
  8. Spring Boot修改内置Tomcat端口号
  9. asp.net 浏览器下载文件的四种方式
  10. STVD中将现有工程重命名为另一个工程