C++ type list 模板
C++ 实现一个type list 模板,在编译期计算。这个type list主要有构造,列表头类型,列表尾类型,concat操作,去除列表元素重复,获取指定元素,删除指定元素的操作。实现代码贴在下面:
#pragma once
#include <iostream>
#include <typeinfo>namespace type_list {// Step 1: 基础类型列表定义// 定义空列表template <typename ...Types>struct list {};// 非空列表的递归定义template <typename Type, typename ...Types>struct list<Type, Types...> {using head = Type;using tail = list<Types...>;};// 定义空列表类型using empty_list = list<>;// Step 2: 获取列表头部类型template <typename TypeList>using head_t = typename TypeList::head;// 获取列表尾部类型template <typename TypeList>using tail_t = typename TypeList::tail;// 构造新列表template <typename Head, typename Tail>struct construct;template <typename Head, typename Tail>using construct_t = typename construct<Head, Tail>::type;template <typename Head, typename ...Types>struct construct<Head, list<Types...>> {using type = list<Head, Types...>;};///template<typename TypeList>struct size;// 模板辅助类template<typename TypeList>constexpr size_t size_v = size<TypeList>::value;//size的模板特化,继承了std::integral_constanttemplate<typename...Types>struct size<list<Types...>> : std::integral_constant<std::size_t, sizeof...(Types)> {};template<class TypeList>constexpr bool empty_v = (size_v<TypeList> == 0);template<class TypeList>struct empty : std::bool_constant<empty_v<TypeList>> {};template<class TypeList>constexpr bool empty_s = empty<TypeList>::value;/// 查找模板的制定索引的value//声明一个模板;template<std::size_t Index, class TypeList>struct get;template<std::size_t Index, class TypeList>using get_t = typename get<Index, TypeList>::type;template<std::size_t Index, class TypeList>struct get {using type = get_t<Index - 1, tail_t<TypeList>>;};template<class TypeList>struct get<0, TypeList> {using type = head_t<TypeList>;};/// concattemplate<typename TypeList1, typename TypeList2>class concat;template<typename T, typename U>using concat_t = typename concat<T, U>::type;template<typename ...T, typename ...U>class concat<list<T...>, list<U...>> {public:using type = list<T..., U...>;};// delete specific typetemplate<typename TypeList, typename Type>class remove_all;template<typename TypeList, typename Type>using remove_all_t = typename remove_all<TypeList, Type>::type;template<typename TypeList, typename Type>class remove_all {public:using head = head_t<TypeList>;using tail = tail_t<TypeList>;using clean_tail = remove_all_t<tail, Type>;using type = std::conditional_t<std::is_same_v<head, Type>, clean_tail, construct_t<head, clean_tail>>;};template<typename Type>class remove_all<empty_list, Type> {public:using type = empty_list;};// get the last typetemplate<typename TypeList>class last;template<typename TypeList>using last_t = typename last<TypeList>::type;template<typename TypeList>class last {public:using type = last_t<tail_t<TypeList>>;};// 递归终止template<typename Type>class last<list<Type>> {public:using type = Type;};// distinct list typetemplate<typename TypeList>class distinct;template<typename TypeList>using distinct_t = typename distinct<TypeList>::type;template <typename TypeList>class distinct{public:using type = construct_t<head_t<TypeList>,distinct_t<remove_all_t<tail_t<TypeList>, head_t<TypeList>>>>;};// 递归终止template <>struct distinct<empty_list> {using type = empty_list;};// print listtemplate<typename T>void print_type() {int status;std::cout << typeid(T).name() << std::endl;}// 打印类型列表template <typename TypeList>struct print_list;template <typename TypeList>void print_list_func() {print_list<TypeList>::print();}// 主模板,递归地打印类型列表template <typename TypeList>struct print_list {static void print() {print_type<head_t<TypeList>>();print_list_func<tail_t<TypeList>>();}};// 终止递归的特化版本template <>struct print_list<empty_list> {static void print() {// 空列表,不打印任何内容}};} // namespace type_list
测试代码
#pragma once#include "type_list.h"
#include <iostream>using namespace std;void test_type_list() {//1.define listusing MyList = type_list::list<int, double, char>;using AnotherList = type_list::list<float, int>;using EmptyList = type_list::list<>;//2. get the head and tail type of listusing MyListHead = type_list::head_t<MyList>;using MyListTail = type_list::tail_t<MyList>;static_assert(std::is_same_v<MyList::tail, type_list::list<double,char>>, "MyList head shoud be int");static_assert(std::is_same_v<MyListTail, type_list::list<double, char>>, "MyList head shoud be int");static_assert(std::is_same_v<MyListHead, int>, "MyList head shoud be int");static_assert(std::is_same_v<MyList::head, int>, "MyList head shoud be int");//3. get list sizeconstexpr std::size_t listSize = type_list::size_v<MyList>;std::cout << listSize << std::endl;// 4. emptystatic_assert(type_list::empty_s<EmptyList>, "is empty");static_assert(type_list::empty_v<EmptyList>, "is empty");// 5. get index posusing FirstType = type_list::get_t<1, MyList>;static_assert(std::is_same_v<FirstType, double>, "not equal");// 6.concat listusing ConcatList = type_list::concat_t<MyList, AnotherList>;using ConcatListHead = type_list::head_t<ConcatList>;static_assert(std::is_same_v<ConcatListHead, int>, "head should be int");static_assert(std::is_same_v<ConcatList::head, int>, "head should be int");constexpr std::size_t concat_list_size = type_list::size_v<ConcatList>;cout << "concat_list_size : " << concat_list_size << endl;// 6.delete list typeusing RemoveIntList = type_list::remove_all<MyList, int>;static_assert(std::is_same_v<type_list::head_t<RemoveIntList>, int>, "the list head shoud not be int");// 6.delete list typeusing LastType = type_list::last_t<MyList>;static_assert(std::is_same_v<LastType, char>, "the last type should be char");// distinct list typeusing RepeatList = type_list::list<int, double, char, int, double, char, int,int,int>;using DistType = type_list::distinct_t<RepeatList>;std::cout << "--------------------------" << endl;type_list::print_list_func<RepeatList>();std::cout << "--------------------------" << endl;type_list::print_list_func<DistType>();std::cout << "--------------------------" << endl;}
相关文章:
C++ type list 模板
C 实现一个type list 模板,在编译期计算。这个type list主要有构造,列表头类型,列表尾类型,concat操作,去除列表元素重复,获取指定元素,删除指定元素的操作。实现代码贴在下面: #pr…...

vscode刷LeetCode算法题环境配置
首先,下载nodejs 在vscode中安装LeetCode插件 安装好进行配置 选择leetcode-cn 填上刚才下载node.exe的路径 完成之后重启一下vscode 重启之后登陆LeetCode 完成之后就可以看到题目了 点击 code now 就可以开始刷题了...

OpenCV报错已解决:Vector析构异常OpencvAssert CrtlsValidHeapPointer
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 在使用OpenCV进行图像处理时,我们可能会遇到Vector析构异常OpencvAssert CrtlsValidHeapPointer的问题。本文将…...

AudioLM音频生成模型
GPT-4o (OpenAI) AudioLM(Audio Language Model)是一种生成音频的深度学习模型。它可以通过学习语言模型的结构来生成连贯和高质量的音频信号。这类模型通常应用于语音合成、音乐生成和音频内容生成等领域。以下是一些与AudioLM相关的核心概念和技术细…...

Shardingsphere-Proxy 5.5.0数据迁移
Shardingsphere-Proxy 5.5.0数据迁移 Shardingsphere系列目录:背景配置集群部署搭建Zookeeper修改shardingsphere-proxy配置重启shardingsphere-proxy 执行数据迁移连接代理数据库实例(Navicate)应用代理数据库注册目标分片数据库存储单元注销…...
c语言中的for循环
在C语言中,for循环是控制结构之一,用于多次执行一段代码。其具体用法如下: 语法 for (初始化表达式; 条件表达式; 更新表达式) {// 循环体 }参数说明 初始化表达式:在循环开始前执行一次,用于初始化循环控制变量。条…...
大模型微调(finetune)方法
lora adapter prefix-tuning p-tuning prompt-tuning 大模型微调后灾难行遗忘 1、主流解决大模型微调后灾难行遗忘的方法是在微调过程中加入通用的指令数据。 2、自我蒸馏方法主要是通过模型本身对任务数据进行生成引导,构建自我蒸馏数据集,改变任务数…...
Bootstrap 5 卡片
Bootstrap 5 卡片 Bootstrap 5 是一个流行的前端框架,它提供了一套丰富的组件和工具,用于快速开发响应式和移动设备优先的网页。在 Bootstrap 5 中,卡片(Card)是一个非常重要的组件,用于展示内容,如文本、图片、列表等。卡片组件具有高度的灵活性和可定制性,可以轻松地…...

【ONLYOFFICE 8.1】的安装与使用——功能全面的 PDF 编辑器、幻灯片版式、优化电子表格的协作
🔥 个人主页:空白诗 文章目录 一、引言二、ONLYOFFICE 简介三、安装1. Windows/Mac 安装2. 文档开发者版安装安装前准备使用 Docker 安装使用 Linux 发行版安装配置 ONLYOFFICE 文档开发者版集成和开发 四、使用1. 功能全面的 PDF 编辑器PDF 查看和导航P…...

「51媒体」浙江地区媒体邀约
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体宣传加速季,100万补贴享不停,一手媒体资源,全国100城线下落地执行。详情请联系胡老师。 浙江地区的媒体邀约资源丰富多样,涵盖了电视台…...

2-18 基于matlab的关于联合对角化盲源分离算法的二阶盲识别(SOBI)算法
基于matlab的关于联合对角化盲源分离算法的二阶盲识别(SOBI)算法。通过联合对角化逼近解混矩阵。构建的四组信号,并通过认为设置添加噪声比例,掩盖信号信息。通过SOBI算法实现了解混。程序已调通,可直接运行。 2-18联合…...
C++中常用的标志库
标准库 C标准库是一个强大的工具集,它包含了一组丰富的类和函数,可以帮助开发者进行各种操作,如输入输出、字符串操作、数据结构管理、算法实现等。以下是一些常用的C标准库及其使用方法。 1. 输入输出库 <iostream> 用于标准输入输…...
近期计算机领域的热点技术
随着科技的飞速发展,计算机领域的新技术、新趋势层出不穷。本文将探讨近期计算机领域的几个热点技术趋势,并对它们进行简要的分析和展望。 一、人工智能与机器学习 人工智能(AI)和机器学习(ML)是近年来计算…...

HarmonyOS Next 系列之可移动悬浮按钮实现(六)
系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现(一) HarmonyOS Next 系列之验证码输入组件实现(二) HarmonyOS Next 系列之底部标签栏TabBar实现(三) HarmonyOS Next 系列之HTTP请求封装和Token…...

如何获得更高质量的回答-chatgpt
在与技术助手如ChatGPT进行交互时,提问的方式直接影响到你获得的答案质量。以下是几个关键的提问技巧,可以帮助你在与ChatGPT的互动中获得更有效的回答: 1. 清晰明了的问题 技巧:确保问题清晰明了,避免含糊不清或模糊的…...

ASP.NET Core 6.0 使用 Log4Net 和 Nlog日志中间件
前言 两年前,浅浅的学过 .NET 6,为啥要记录下来,大概是为了以后搭架子留下引线,还有抛砖引玉。 1. 环境准备 下载 建议使用 Visual Studio 2022 开发版 官网的下载地址:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具借助 Visual Studio 设计,具有自动完成…...
使用Spring Boot实现与ActiveMQ的消息队列集成
使用Spring Boot实现与ActiveMQ的消息队列集成 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 消息队列在现代分布式系统中扮演着至关重要的角色,…...

深度学习 - Transformer 组成详解
整体结构 1. 嵌入层(Embedding Layer) 生活中的例子:字典查找 想象你在读一本书,你不认识某个单词,于是你查阅字典。字典为每个单词提供了一个解释,帮助你理解这个单词的意思。嵌入层就像这个字典…...

ONLYOFFICE 8.1编辑器桌面应用程序来袭——在线全面测评
目录 ✈下载✈ 👀界面👀 👊功能👊 🧠幻灯片版式的重大改进🧠 ✂无缝切换文档编辑、审阅和查看模式✂ 🎵在演示文稿中播放视频和音频文件🎵 🤗版本 8.1:…...

《Windows API每日一练》6.4 程序测试
前面我们讨论了鼠标的一些基础知识,本节我们将通过一些实例来讲解鼠标消息的不同处理方式。 本节必须掌握的知识点: 第36练:鼠标击中测试1 第37练:鼠标击中测试2—增加键盘接口 第38练:鼠标击中测试3—子窗口 第39练&…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...