C++ 模板元编程语法大全
C++ 模板元编程语法大全
模板元编程(Template Metaprogramming, TMP)是C++中利用模板在编译期进行计算和代码生成的强大技术。以下是C++模板元编程的核心语法和概念总结:
1. 基础模板语法
类模板
template <typename T>
class MyClass {// 类定义
};
函数模板
template <typename T>
T max(T a, T b) {return a > b ? a : b;
}
非类型模板参数
template <typename T, int N>
class Array {T data[N];// ...
};
2. 模板特化
全特化
template <>
class MyClass<int> {// 针对int类型的特化实现
};
偏特化
template <typename T>
class MyClass<T*> {// 针对指针类型的偏特化
};
3. 可变参数模板
template <typename... Args>
void print(Args... args);// 递归展开
template <typename T, typename... Rest>
void print(T first, Rest... rest) {std::cout << first << " ";print(rest...);
}// 终止条件
void print() {}
4. SFINAE (Substitution Failure Is Not An Error)
template <typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type
foo(T t) {// 仅对整数类型有效return t;
}
5. 类型萃取 (Type Traits)
#include <type_traits>// 检查类型是否是整数
static_assert(std::is_integral<int>::value, "int is integral");// 移除const限定符
std::remove_const<const int>::type; // int
6. 编译期计算
编译期阶乘
template <int N>
struct Factorial {static const int value = N * Factorial<N-1>::value;
};template <>
struct Factorial<0> {static const int value = 1;
};constexpr int fact5 = Factorial<5>::value; // 120
constexpr函数 (C++11起)
constexpr int factorial(int n) {return n <= 1 ? 1 : n * factorial(n-1);
}
constexpr int fact5 = factorial(5); // 120
7. 模板元编程常用技巧
条件选择
template <bool B, typename T, typename F>
using Conditional = typename std::conditional<B, T, F>::type;
编译期判断
template <typename T1, typename T2>
struct IsSame {static const bool value = false;
};template <typename T>
struct IsSame<T, T> {static const bool value = true;
};
类型列表操作
template <typename... Ts>
struct TypeList {};// 获取第一个类型
template <typename List>
struct Front;template <typename Head, typename... Tail>
struct Front<TypeList<Head, Tail...>> {using type = Head;
};
8. C++17及以后的新特性
if constexpr
template <typename T>
auto get_value(T t) {if constexpr (std::is_pointer_v<T>) {return *t;} else {return t;}
}
折叠表达式
template <typename... Args>
auto sum(Args... args) {return (args + ...); // 折叠表达式
}
概念(Concepts) (C++20)
template <typename T>
concept Integral = std::is_integral_v<T>;template <Integral T>
T add(T a, T b) {return a + b;
}
9. 模板元编程实用工具
编译期字符串
template <char... Chars>
struct FixedString {static constexpr char value[] = {Chars..., '\0'};
};
编译期数组
template <typename T, T... Values>
struct ValueList {static constexpr T array[] = {Values...};
};
10. 高级技巧
CRTP (奇异递归模板模式)
template <typename Derived>
class Base {void interface() {static_cast<Derived*>(this)->implementation();}
};class Derived : public Base<Derived> {void implementation();
};
表达式模板
template <typename L, typename R>
struct AddExpr {L const& lhs;R const& rhs;auto operator[](size_t i) const { return lhs[i] + rhs[i]; }
};template <typename E>
class Vec {// 通过表达式模板实现延迟计算
};
模板元编程是C++中最复杂的特性之一,但它提供了强大的编译期计算和代码生成能力。随着C++标准的演进,模板元编程的语法和功能也在不断丰富和完善。
相关文章:
C++ 模板元编程语法大全
C 模板元编程语法大全 模板元编程(Template Metaprogramming, TMP)是C中利用模板在编译期进行计算和代码生成的强大技术。以下是C模板元编程的核心语法和概念总结: 1. 基础模板语法 类模板 template <typename T> class MyClass {// 类定义 };函数模板 t…...

SPSS跨域分类:自监督知识+软模板优化
1. 图1:SPSS方法流程图 作用:展示了SPSS方法的整体流程,从数据预处理到模型预测的关键步骤。核心内容: 领域知识提取:使用三种词性标注工具(NLTK、spaCy、TextBlob)从源域和目标域提取名词或形容词(如例句中提取“excellent”“good”等形容词)。词汇交集与聚类:对提…...
【术语扫盲】BSP与MSP
专业解释版: MSP(Microcontroller Support Package) 定义:MSP 是微控制器支持包,包含 MCU 的启动代码、寄存器配置、驱动库等,主要针对 芯片本身。 作用:提供通用的底层硬件抽象,方…...

vscode的Embedded IDE创建keil项目找不到源函数或者无法跳转
创建完Embedded IDE项目后跳转索引很容易找不到源函数或者无法跳转,原因是vscode工作区被eide覆盖了,需要手动往当前目录下的.vscode/c_cpp_properties.json里添加路径 打开eide.json ,找到folders, 里面的name是keil里工程的虚拟…...
HTTP/2与HTTP/3特性详解:为你的Nginx/Apache服务器开启下一代Web协议
更多服务器知识,尽在hostol.com 嘿,各位站长和服务器管理员朋友们!咱们天天跟网站打交道,都希望自己的网站能像火箭一样快,用户体验“嗖嗖”的。但你知道吗?除了服务器硬件配置、代码优化、CDN加速这些“常…...

构建高效智能客服系统的8大体验设计要点
构建一流的客户服务中心体验,企业需要以用户需求为核心,将智能化流程、前沿科技与人文关怀有机结合,打造流畅、高效且富有温度的服务生态。在客户需求日益多元化的今天,单纯的问题解决能力已无法满足期待,关键在于通过…...

CppCon 2014 学习:Making C++ Code Beautiful
你说的完全正确,也很好地总结了 C 这门语言在社区中的两种典型看法: C 的优点(Praise) 优点含义Powerful允许底层控制、系统编程、高性能计算、模板元编程、并发等多种用途Fast无运行时开销,接近汇编级别性能&#x…...
副本(Replica)在Elasticsearch中扮演什么角色?
在Elasticsearch(ES)中,副本(Replica)是主分片(Primary Shard)的镜像拷贝,与主分片共同构成分布式索引的高可用性和高性能架构。副本的设计目标是解决数据冗余、负载均衡和故障恢复等核心问题,其具体作用和原理如下: 一、副本的核心角色与功能 1. 数据冗余与故障恢…...

据传苹果将在WWDC上发布iOS 26 而不是iOS 19
苹果可能会对其操作系统的编号方式做出重大改变,基于年份的新版系统会将iOS 19重新命名为 iOS 26,同时 macOS 也会以同样的方式命名。 苹果的编号系统相当简单,版本号每年都会像钟表一样定期更新。然而,今年秋天情况可能有所不同&…...
整理了Windows(7—11)官方镜像下载链接和各版本区别介绍
原文《整理了Windows(7—11)官方镜像下载链接和各版本区别介绍》 引言 在安装或重装Windows系统时,使用微软官网提供的正版ISO镜像可以保证系统完整性和安全更新,避免使用第三方盗版镜像带来的恶意软件、广告风险。 本期汇总了微…...
数据库主键与索引详解
目录 主键核心特性 主键必要性问题 索引核心解析 基本定义 优劣分析 索引类型对比 数据结构实现 工作原理 主键与索引核心区别 主键核心特性 唯一标识:确保字段数据不重复且不为空数量限制:每表仅允许存在一个主键存储类型:通常采用…...
RTOS:启动调度器的作用(含源码逐行解读)
文章目录 前言一、启动调度器二、详细逻辑分析三、逐行分析3.1、traceENTER_vTaskStartScheduler3.2、configASSERT( ( sizeof( UBaseType_t ) * taskBITS_PER_BYTE ) > configNUMBER_OF_CORES );3.3、xReturn prvCreateIdleTasks();3.4、xTimerCreateTimerTask();3.5、fre…...
【Python 进阶】抽象基类(Abstract Base Class)
abc 模块和抽象基类(Abstract Base Class)的概念: 本文的示例代码来源于 break-a-scene. abc 是 Python 标准库中的一个模块,全称是 “Abstract Base Classes”(抽象基类)。它提供了一种定义抽象类和抽象方法的机制。在以下代码…...
Armv7l或树莓派32位RPI 4B编译faiss
pip3 install faiss-cpu当然找不到预编译的包 手动下载 git clone https://github.com/facebookresearch/faiss.git cd faiss #能需要切换到特定版本标签,例如 v1.7.1,这个版本Cmake 3.18可以过,因为apt install安装的cmake只更新到这里&am…...

嵌入式开发STM32 -- 江协科技笔记
1.背景介绍及基础认知 8大输入输出 斯密特触发器:高于设定阈值输出高电平,低于设定阈值输出低电平 有关上拉输入、下拉输入、推挽输出、开漏输出、复用开漏输出、复用推挽输出以及浮空输入、模拟输入的区别 1、上拉输入:上拉就是把电位拉高…...

[网页五子棋][用户模块]客户端开发(登录功能和注册功能)
文章目录 客户端开发登录功能htmlcsscommon.csslogin.css jQuery引入 jquery 运行程序注册功能 客户端开发 登录功能 html <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport&…...
nt!MiInitializeSystemCache函数分析之PointerPte->u.List.NextEntry的由来
第一部分: 1: kd> dd 0xc0304200 c0304200 c10c0000 00000000 00000000 00000000 c0304210 00000000 00000000 00000000 00000000 c0304220 00000000 00000000 00000000 00000000 c0304230 00000000 00000000 00000000 00000000 c0304240 00000000 00000000…...

MQTT协议,EMQX部署,MQTTX安装学习
一、MQTT概述 1.什么是MQTT MQTT是一种基于“发布订阅“”模式的消息传输协议。 消息:设备和设备之间传输的数据,或者服务和服务之间要传输的数据。 协议:传输数据时所遵循的规范。 2.常见的通讯模式 (1)客户端-服…...
如何理解UDP 和 TCP 区别 应用场景
UDP与TCP的定义、特性、使用场景及对比表格 定义 UDP(User Datagram Protocol)是一种无连接的传输层协议,提供不可靠的数据报服务。 TCP(Transmission Control Protocol)是一种面向连接的传输层协议,提供…...

60天python训练计划----day40
DAY 40 训练和测试的规范写法 知识点回顾: 彩色和灰度图片测试和训练的规范写法:封装在函数中展平操作:除第一个维度batchsize外全部展平dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropout 一.单通道图…...

干泵,干式螺杆真空泵
干式真空泵: 无油干式机械真空泵(又简称干式机械泵)是指泵能从大气压力下开始抽气,又能将被抽气体直接排到大气中去,泵腔内无油或其他工作介质,而且泵的极限压力与油封式真空泵同等量级或者接近的机械真空泵…...

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(五):语音合成输出与交互增强
Tailwind CSS 实战,基于Kooboo构建AI对话框页面(一) Tailwind CSS 实战,基于Kooboo构建AI对话框页面(二):实现交互功能 Tailwind CSS 实战,基于 Kooboo 构建 AI 对话框页面&#x…...

职业本科院校无人机专业人才培养解决方案
2023年的中央经济工作会议强调了以科技创新推动现代化产业体系构建的重要性,并提出发展生物制造、商业航天、低空经济等战略性新兴产业。低空经济,依托民用无人机等低空飞行器,在多场景低空飞行活动的牵引下,正逐步形成一个辐射广…...
利用机器学习优化数据中心能效
数据中心作为现代社会的数字基础设施,支撑着云计算、大数据分析、人工智能等关键技术的发展。然而,随着数据中心规模的不断扩大,其能源消耗问题也日益凸显。如何提高数据中心的能源效率,降低运营成本,同时减少环境影响…...

软件评测机构如何保障质量?检测资质、技术实力缺一不可
软件评测机构在保障软件质量上起着关键作用,对软件行业的健康发展极为关键。它们采用专业的技术手段和严格的评估流程,对软件的运行效果、功能等多方面进行细致的审查,为开发者和使用者提供了客观、公正的参考依据。 检测资质正规软件评测机…...
微软开源bitnet b1.58大模型,应用效果测评(问答、知识、数学、逻辑、分析)
微软开源bitnet b1.58大模型,应用效果测评(问答、知识、数学、逻辑、分析) 目 录 1. 前言... 2 2. 应用部署... 2 3. 应用效果... 3 1.1 问答方面... 3 1.2 知识方面... 4 1.3 数字运算... 6 1.4 逻辑方面... …...
ubuntu 安装上传的 ffmpeg_7.1.1.orig.tar.xz并使用
在 Ubuntu 系统上离线安装 make 需要提前准备好所有依赖包。以下是详细的操作步骤: 准备工作:在有网络的机器上下载所需软件包 查找依赖关系 在有网络的 Ubuntu 机器上(需与目标机器相同版本)执行: # 获取 make 及其依…...
Web3怎么开发类似MetaMask的钱包
开发一个类似MetaMask的钱包,关键就是要利用以太坊提供的官方接口和标准,主要涉及以下几点: 1. 你要用到的以太坊官方接口和规范 JSON-RPC API 以太坊节点(如Geth、OpenEthereum等)通过JSON-RPC接口暴露各种功能&…...

Linux多线程(六)之线程控制4【线程ID及进程地址空间布局】
文章目录 线程ID及进程地址空间布局线程局部存储 线程ID及进程地址空间布局 pthread_ create函数会产生一个线程ID,存放在第一个参数指向的地址中。 该线程ID和前面说的线程ID不是一回事。 前面讲的线程ID属于进程调度的范畴。 因为线程是轻量级进程ÿ…...

1.什么是node.js、npm、vue
一、Node.js 是什么? 😺 定义: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,让你可以在浏览器之外运行 JavaScript 代码,主要用于服务端开发。 😺从计算机底层说:什么是“运…...