C++ 使用模板序列化/反序列化固定键值对

2023-05-16

仅是一个原型,留作记录。我感觉可以写出非常逆天的代码。

#include <array>
#include <string>
#include <map>
#include <tuple>
#include <string_view>

template <size_t key_name_length>
struct key_name_t
{
	std::array<char16_t, key_name_length> name;
	constexpr key_name_t(const char16_t(&name)[key_name_length])
	{
		for (size_t i = 0; i < key_name_length; i++)
			this->name[i] = name[i];
	}
	constexpr operator std::u16string_view() const
	{
		return { name.begin(), name.end() - (name.back() == 0) };
	}
};

template <key_name_t key_name, typename T>
class key_name_with_type
{
public:
	using type = T;
};

template <key_name_t key_name, typename T>
using key_name_with_type_t = key_name_with_type<key_name, T>::type;

template <key_name_t ...key_names>
class value_t : public std::tuple<key_name_with_type_t<key_names, std::u16string>...>
{
private:
	using value_tuple_t = std::tuple<key_name_with_type_t<key_names, std::u16string>...>;
	static constexpr auto key_name_tuple = std::tuple{ key_names... };
	static constexpr size_t size = std::tuple_size_v<value_tuple_t>;

private:
	template<class map_t, size_t index>
	void _serialize(map_t& map, std::index_sequence<index>) const
	{
		map[map_t::key_type(std::get<index>(key_name_tuple))] = std::get<index>(*this);
	}
	template<class map_t, size_t current_index, size_t ...rest_index>
	void _serialize(map_t& map, std::index_sequence<current_index, rest_index...>) const
	{
		_serialize(map, std::index_sequence<current_index>());
		_serialize(map, std::index_sequence<rest_index...>());
	}
public:
	template<class map_t>
	void serialize(map_t& map) const
	{
		constexpr size_t size = std::tuple_size_v<std::tuple<key_name_with_type_t<key_names, std::u16string>...>>;
		_serialize(map, std::make_index_sequence<size>());
	}

private:
	template<class map_t, size_t index>
	void _deserialize(const map_t& map, std::index_sequence<index>)
	{
		std::get<index>(*this) = map.at(map_t::key_type(std::get<index>(key_name_tuple)));
	}
	template<class map_t, size_t current_index, size_t ...rest_index>
	void _deserialize(const map_t& map, std::index_sequence<current_index, rest_index...>)
	{
		_deserialize(map, std::index_sequence<current_index>());
		_deserialize(map, std::index_sequence<rest_index...>());
	}
public:
	template<class map_t>
	void deserialize(const map_t& map)
	{
		_deserialize(map, std::make_index_sequence<size>());
	}

public:
	static constexpr size_t npos = std::numeric_limits<size_t>::max();

private:
	template<size_t index>
	static constexpr size_t _key_index(std::u16string_view key, std::index_sequence<index>)
	{
		if (key == std::get<index>(key_name_tuple))
			return index;
		return npos;
	}
	template<size_t current_index, size_t ...rest_index>
	static constexpr size_t _key_index(std::u16string_view key, std::index_sequence<current_index, rest_index...>)
	{
		size_t result = _key_index(key, std::index_sequence<current_index>());
		if (result != npos)
			return result;
		return _key_index(key, std::index_sequence<rest_index...>());
	}

public:
	static constexpr size_t key_index(std::u16string_view key)
	{
		return _key_index(key, std::make_index_sequence<size>());
	}

public:
	template<key_name_t key>
	auto& get()
	{
		return std::get<key_index(key)>(*this);
	}
};

using record_t = value_t<u"Key1", u"Key2", u"Key_3">;

int main()
{
	record_t r;
	std::map<std::u16string, std::u16string, std::less< >> map;
	r.serialize(map);
	map.at(u"Key2") = u"123";
	r.deserialize(map);

	auto test1 = std::get<1>(r);
	auto test2 = r.get<u"Key2">();
	// r.get<u"Key3">(); // 编译时报错。
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 使用模板序列化/反序列化固定键值对 的相关文章

  • HashMap详解

    HashMap 16 xff0c 0 75 为什么能快速查找 xff1f put操作放入key时 获取key的hash值 在原始hash值的基础上再次获取hash值 二次hash值与容量取模运算 capacity 获得桶下标 根据桶下标 x
  • 设计模式——单例模式

    单例模式 饿汉式 类加载阶段被初始化就会创建实例 提前创建 span class token keyword class span span class token class name Singleton span span class
  • Java多线程

    并发 线程状态 Debug调试 xff0c 线程模式 java xff1a 6种状态 NEW 新建 startRUNNABLE 就绪 运行 阻塞I O cpu 调度TERMINATED 终结 代码执行完毕BLOCKED 阻塞 获取锁失败WA
  • JVM垃圾回收

    GC与分代回收算法 GC目的 xff1a 实现无用对内存自动释放 xff0c 减少内存碎片 加快分配速度 GC要点 xff1a 回收区域 xff1a 堆内存可达性分析算法 三色标记法GC具体实现称垃圾回收器GC采用分代回收思想 xff0c
  • 4种对象引用类型

    1 强引用 A a 61 new A 通过GC Root的引用链 xff0c 如果强引用不到该对象 xff0c 该对象才会被回收 2 软引用 SoftReference a 61 new SoftReference new A 如果仅有软引
  • SQL语句

    Select SQL 执行顺序 fromonjoinwheregroup byhavingselectdistinctorder bylimit WHERE 字段比较 代码作用 61 等于 lt gt 61 不等于 lt lt 61 小于
  • Bootstrap笔记

    Bootstrap样式 CSS导入 span class token tag span class token tag span class token punctuation lt span link span span class to
  • JSTL与EL表达式

    什么是JSTL JSTL是对EL表达式的扩展 xff0c JSTL是标签语言 xff01 规范了每个标签的职责范围 JSTL标签库 core 核心标签库 fmt 格式化标签库 导标签包 span class token operator l
  • Ubuntu中/usr/local 和 ~/.local 之间的区别

    Ubuntu中 usr local 和 local 之间的区别 usr local 是一个可供所有用户使用的软件可由管理员安装的地方 local bin 是一个用户可以安装软件供自己使用的地方 不同发行版和社区使用的目录结构的历史有些混乱
  • Centos7配置yum镜像源(base,extras,updates,epel,local)

    一 备份默认源 由于默认源都在国外 xff0c 速度非常慢 xff0c 需要把默认的源配置文件备份后删除 span class token comment 进入配置文件目录 span span class token function cd
  • win10彻底关闭windows update 自动更新的方法

    转载自 xff1a https jingyan baidu com article 6181c3e0d75aaa152ef15326 html 其实保留更新还是很有用的 xff0c 毕竟官方一直在修复漏洞 但是服务器虚拟机中运行的win10
  • 解决Centos 7 VNC黑屏

    在配置Centos 7下VNC时发现root用户可以正常登陆VNC桌面 xff0c 而普通用户VNC桌面黑屏 xff0c 分析 vnc xstarup 后发现是普通用户没有执行 etc X11 xinit xinitrc的权限 bin sh
  • 一个与cni0相关的pod创建问题

    今天查看k8s xff0c 发现有个coredns的pod创建失败 xff0c 查看这个POD的信息 xff0c 显示如下错误 combined from similar events Failed to create pod sandbo
  • Debian10安装SSH、配置NTP、安装配置UFW防火墙、配置PATH

    一 SSH安装配置 1 1 安装SSH span class token comment 安装SSH客户端 span apt span class token function install span openssh client spa
  • Debian10 创建用户、用户组、切换用户

    span class token comment 新建用户组 span span class token function groupadd span hausers span class token comment 新建用户并加入用户组
  • C++关于循环依赖的问题

    C 43 43 关于循环依赖的问题 xff1a 循环情况 xff1a class B class A public B b class B public A a 若两个类之间存在循环依赖则在编译时会报错 xff0c 原因是两个类中存在相互的
  • Rust小项目一:Rust 网络编程,实现一个Tcp server

    近日学习Substrate的开发入门 xff0c 之前没有接触过Rust编程 xff0c 今天跟着视频做个小项目练练手 项目目标 xff1a 编写一个Tcp server端与一个Tcp client端 xff0c 客户端中输入内容后 xff
  • Python 项目打包并发布到私有 PyPI 服务器

    推广博客 xff1a Python 项目打包并发布到私有 PyPI 服务器
  • C++ 零碎特性

    摘自 C 43 43 17 入门经典 几乎不会再更新 文章目录 使用花括号初始化变量零初始化使大整型字面量更加易读二进制的整型字面量 96 size t 96 类型浮点数的特殊情况 xff1a NaN xff08 Not a Number
  • Python 学习笔记——进阶

    文章目录 一 模块 xff08 一 xff09 1 导入外部模块2 导入时重命名3 标准库 xff08 一 xff09 96 sys 96 96 argv 96 变量 96 exit 96 函数 96 modules 96 变量 96 pa

随机推荐

  • C++ UTF-8 编码与 UTF-32 编码的互相转换

    C 43 43 UTF 8 编码与 UTF 32 编码的互相转换 代码实现基本照搬了秦建辉的博客 这里不介绍原理 xff0c 只提供可以直接使用的代码 要求 C 43 43 编译器的语言标准至少为 C 43 43 17 如果编译器支持的语言
  • C++ 默认移动构造函数的调用情况

    C 43 43 默认移动构造函数的调用 直接上测试代码 xff1a include lt cstdio gt include lt iostream gt include lt string gt class MyClass int a 6
  • LaTeX 003:使用 MikTeX 组件实现 pdf 转 eps

    气死了气死了 xff0c 这玩意儿居然直接百度不到一个很好的答案 xff0c 百度到的全是用带图形化界面的软件 xff0c 您不累吗 xff1f 唯一找到的一个 xff0c 效果不好 xff0c 是糊的 最后还是上谷歌镜像站 xff0c 一
  • 【深入浅出ios开发】UIStoryboardSegue详解

    一个UIStoryboardSegue对象负责执行两个试图控制器之间的视觉过渡 另外 xff0c segue对象通常用来准备从一个控制器过渡到另一个控制器 segue对象包含了涉及过渡的控制器的信息 当segue被触发 xff0c 并且在视
  • C++ 多线程编程导论(上)

    随着摩尔定律逼近失效和多核处理器快速发展 xff0c 多线程编程变得越来越重要 本文将系统介绍在 C 43 43 中如何使用 STL 实现多线程编程 多线程编程博大精深 xff0c 本文并不介绍多线程算法或多线程编程方法 xff0c 而是把
  • 使用 WaitForSingleObject 等待进程结束错误代码 5(拒绝访问)问题的解决

    说明使用 OpenProcess 的权限不够 xff0c 但是哪个权限呢 xff1f 查阅文档发现是 SYNCHRONIZE SYNCHRONIZE 0x00100000L 使用对象的同步机制的权限 该权限允许线程等待该对象 xff0c 直
  • LaTeX 004:隐藏 hyperref 超链接的红框

    针不戳 xff0c 很快找到答案了针不戳 以往的方法是设置超链接红框的颜色 hypersetup pdfauthor 61 UnnamedOrange colorlinks 61 true linkcolor 61 black anchor
  • LaTeX 005:删除一个命令

    C 43 43 的预编译系统中 xff0c 可以使用 undef 来取消 xff08 Undefine xff09 一个宏 LaTeX LaTeX L A T E X 中是否有类似于这样的功能呢 xff1f 网上的一个评论给出了解决方案 x
  • LaTeX 006:添加一个只有文字没有标号的脚标

    想要如下的效果 xff1a 该脚标只想要写一句注释 xff0c 没有对应的正文文本 如何实现 xff1f 直接使用 footnotetext 是不佳的 xff0c 前面会加上当前的脚标标号 xff0c 而且该标号不会自动递增 虽然 foot
  • GetExitCodeProcess 所需运行时间

    GetExitCodeProcess 在 Windows 中用于获取进程的返回代码 这个看上去只有一个读操作的函数运行速度如何呢 xff1f 直觉上不会很快 xff0c 因为它肯定涉及操作系统进程表的操作 下面做了一个实验 代码 xff1a
  • C++ 继承时返回值或参数的类型是父类的行为

    见以下代码的 base t amp operator 61 const base t amp another 还没有搞清楚 span class token macro property span class token directive
  • LaTeX 007:texify 调用 zhmakeindex

    如文档所述 xff0c 在系统增加一个值为 zhmakeindex 路径的环境变量 MAKEINDEX 即可
  • 转载:LaTeX 定义参数变长的命令

    本文作者 xff1a Liam Huang 本文链接 xff1a https liam page 2017 07 30 define a new command with different amount of parameters in
  • 一个简单的 Lex 词法分析程序示例

    作为一个学习 Lex 词法分析程序的例子 xff0c 下面的 lex 程序将会生成一个分析 LaTeX 中命令的词法分析器 下面的程序包含了很多 lex 语言的语法 xff0c 正则表达式除外 正则表达式的用法网上比较多 xff0c 这里不
  • mysql数据库conf配置详解

    mysqld port 61 6033 skip grant tables datadir 61 usr tools mysql data socket 61 usr tools mysql mysql sock user 61 mysql
  • LaTeX 008:比较方便的键入下划线的方式

    在 LaTeX 中 xff0c 我们有时会需要输入下划线 直接键入 是不行的 xff0c 会出现的编译错误 xff0c 正如网友所述 xff0c LaTeX 为了简化对编译错误的处理禁止在文本模式 xff08 text mode xff09
  • LaTeX 009:自定义带有 * 号的命令

    LaTeX 中 xff0c 我们经常见到 section 和 section xff0c 分别表示有编号的 section 和没有编号的 section 我们也想自己定义带有 号的命令 xff0c 但写下面的代码时却报错了 xff1a ne
  • 2022 New Year‘s Resolution

    Some Might Say 2022 New Year 39 s Resolution Some might say we are on the edge of the new era Always are they saying thi
  • C++ 多线程编程导论(中)

    受篇幅限制 xff0c 上半部分不再更新 xff0c 填坑的新内容都放在此文章中 文章目录 参考资料线程安全 xff08 续 xff09 互斥访问 互斥体 xff08 mutex xff09 和锁 xff08 lock xff09 什么是互
  • C++ 使用模板序列化/反序列化固定键值对

    仅是一个原型 xff0c 留作记录 我感觉可以写出非常逆天的代码 span class token macro property span class token directive hash span span class token d