奇异递归模版模式(CRTP)

news/2026/1/21 22:00:58/文章来源:https://www.cnblogs.com/caijianhong/p/19514169

奇异递归模版模式(CRTP)

哦哦哦今天来学一下:CRTP 奇异递归模板模式(编译期多态)。

奇异递归模板模式(CRTP)是一种惯用法,其中类 X 继承自类模板 Y,并以模板参数 Z 实例化 Y,其中 Z = X。例如:

template<class Z>
class Y {};
 
class X : public Y<X> {};

这就是 CRTP 的最基本的形式。CRTP 可用于实现“编译时多态”,即基类公开一个接口,而派生类实现该接口。优势如下:

  1. 与运行时多态相比,CRTP 不需要查虚函数表,函数可以被内联,供编译器优化的空间大。
  2. 与裸继承相比,CRTP 使基类知道派生类的类型,并能把针对每个派生类的函数下放给派生类(即基类函数可以得知派生类)。

劣势:CRTP 是静态的,CRTP 会使代码体积膨胀。

典型示例 1:单例模式

// 使用CRTP实现单例模式
template<typename Derived>
class Singleton {
protected:// 保护构造函数,防止外部实例化Singleton() = default; // 注意,protected 的构造函数是 CRTP 必要(极推荐)的~Singleton() = default; // 下面这些包括析构函数都只是单例模式需要的// 禁止拷贝和赋值Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;Singleton(Singleton&&) = delete;Singleton& operator=(Singleton&&) = delete;
public:// 获取单例实例的静态方法static Derived& instance() {// 局部静态变量(C++11保证线程安全)static Derived instance;return instance;}
};// 派生类示例
class Logger : public Singleton<Logger> {// 需要声明基类为友元,因为基类要访问私有构造函数friend class Singleton<Logger>;
private:Logger() { std::cout << "Logger created\n"; }~Logger() { std::cout << "Logger destroyed\n"; }
public:void log(const std::string& message) {std::cout << "[LOG] " << message << "\n";}
private:int logLevel = 1;
};Logger::instance().log("Application started"); // 基类下放静态函数 instance 为 Logger 所用,Logger 可以直接用这个静态函数,获得自己的单例

典型示例 2:表达式模板(std::valarray 使用的技术),自己去看 The dark side of the force - 洛谷专栏 吧,太长了。

通用模板(的示例):

template <class Derived>
struct matroid {void build(int ban) { self().build(ban); }bool oracle(int x) const { return self().oracle(x); }protected:matroid() = default;auto& self() { return *static_cast<Derived*>(this); }auto& self() const { return *static_cast<const Derived*>(this); }
};
struct matroid_color : matroid<matroid_color> {int cnt[N];void build(int ban) {memset(cnt, 0, sizeof cnt);for (int i = 1; i <= m; i++) if (vis[i] && i != ban) {cnt[e[i].w] += 1;}}bool oracle(int x) const {return cnt[e[x].w] < c[e[x].w];}
};

注意,使用的时候是直接使用派生类,不使用基类,也不要实例化基类,用基类的指针也没有必要(所以在这个例子里面,CRTP 没有起实质作用)。

CRTP 有很大的潜力,可以尝试合理的使用,获得更好的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1196418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

turingfd tdid 分析

import hashlib import zlibimport xxtea from jce import loadskey = hashlib.md5(bytes.fromhex(4446472324255e2325245247485228262a4d3c3e3c)).hexdigest() print(key) print()def de_packet(input_bytes):zlib_by…

MySQL 8.0.35 单实例升级到MySQL 8.4.x

MySQL 8.0.35 单实例升级到MySQL 8.4.x2026-01-21 21:46 潇湘隐者 阅读(0) 评论(0) 收藏 举报因为MySQL 8.0.x版本即将于2026年4月结束服务支持,计划将手头MySQL 8.0.35升级到MySQL 8.4.8这个LTS版本. 下面是之前…

告别绘图内卷!虎贲等考 AI:一键生成期刊级科研图表的秘密武器

还在为 Origin 调参两小时只出一张图抓狂&#xff1f;还在因 PPT 示意图太丑被导师吐槽 “不像学术成果”&#xff1f;辛辛苦苦画的图表&#xff0c;却因格式不规范被期刊审稿人打回修改&#xff1f;作为深耕论文写作科普的博主&#xff0c;我实测多款绘图工具后发现&#xff0…

【模板】拟阵交

【模板】拟阵交 给定边集 \(E\),每条边都有一个颜色。给定数组 \(\{C_i\}\)。选出最大的子集使得:子集中找不到一个简单环;子集中颜色 \(c\) 的边的出现次数不超过 \(C[c]\)。 本题即为拟阵交的模板题,需要求解图拟…

[豪の算法奇妙冒险] 代码随想录算法训练营第三十五天 | 01背包问题-二维dp解法、01背包问题-一维dp解法、416-分割等和子集

01背包问题-二维dp解法、01背包问题-一维dp解法、LeetCode416 分割等和子集代码随想录算法训练营第三十五天 | 01背包问题-二维dp解法、01背包问题-一维dp解法、416-分割等和子集01背包问题-二维dp解法文章讲解:https…

expo-video实现横屏播放

我在使用expo-video的过程中,发现它的全屏功能很是差强人意,所以想自己二次封装一下 如果看过我之前的expo文章,应该可以轻松的读懂下面的代码 一、安装相关依赖 npx expo install expo-video expo-router expo-scr…

2026百度AI优化GEO服务商 TOP5:综合实力强的文心一言GEO服务商领跑AI搜索破局赛道

综合实力强的 GEO服务商 赋能品牌实现 百度AI 精准曝光与流量转化 随着生成式人工智能的迅速发展,AI搜索平台正在重构传统信息分发与获取的模式。特别是以百度“文心一言”为代表的AI原生平台,逐步替代了传统的搜索入…

【珍藏干货】从零开始实战:企业级AI售前机器人开发全流程(含三大核心系统详解)

“从0到1完成一个企业级AI售前机器人的实战指南。” AI应用中除了我们常见的工作流、各类功能节点之外&#xff0c;通常还会附带有三个辅助系统&#xff1a; 用来AI记住用户的历史交互信息&#xff0c;从而提供更连贯、个性化和高效的响应的记忆系统用来验证AI在实际应用中的…

盘点7款热门AI论文写作助手:提升学术效率并有效减少重复内容

AI写论文工具排名&#xff1a;7大模型查重率低技巧推荐 7大AI论文工具核心对比 工具名称 核心功能 查重优化 适用场景 效率评分 AiBiye 论文全流程辅助 智能降重 从选题到定稿 ★★★★★ AiCheck 查重与降重 深度降重算法 论文修改阶段 ★★★★☆ AskPaper …

想让win11暂停系统自动更新要怎么办?如何彻底禁止win11系统自动更新

Windows 11的自动更新功能&#xff0c;初衷是为了提升系统安全与性能。但在实际使用中&#xff0c;频繁的后台下载和强制重启往往让人困扰&#xff0c;尤其是对正在工作、游戏或需要稳定环境的用户来说&#xff0c;更是不可忽视的问题。因此&#xff0c;学会灵活地关闭或延迟自…

AI论文助手Top8:全方位对比主流平台写作水准与降重能力,高效解决用户需求

AI论文生成工具排行榜&#xff1a;8个网站对比&#xff0c;论文降重写作功能全 工具对比总结 以下是8个AI论文工具的简要排名&#xff0c;基于核心功能、处理速度和适用性对比。排名侧重实用性与用户反馈&#xff0c;数据源于引用内容案例&#xff1a; 工具名称 主要功能 优…

Leetcode 238. Product of Array Except Self

问题理解 给定一个整数数组 nums,要求返回一个新数组 answer,其中 answer[i] 是除 nums[i] 以外所有元素的乘积。注意,有0存在。思路 第一个想法是类似sliding window法,先算第 1~(n-1) 个元素的乘积,作为ans[0],…

电脑win11系统怎么关闭自动更新,win11暂停和关闭系统自动更新6大招轻松搞定

Windows 11的自动更新功能&#xff0c;初衷是为了提升系统安全与性能。但在实际使用中&#xff0c;频繁的后台下载和强制重启往往让人困扰&#xff0c;尤其是对正在工作、游戏或需要稳定环境的用户来说&#xff0c;更是不可忽视的问题。因此&#xff0c;学会灵活地关闭或延迟自…

Oracle数据库迁移至KingbaseES:完整实战指南

Oracle数据库迁移至KingbaseES&#xff1a;完整实战指南 KingbaseES内部提供了大量的Oracle兼容特性&#xff0c;因此&#xff0c;在实际的迁移过程中&#xff0c;一般只需对导出脚本做很少的修改&#xff0c;甚至在迁移对象功能全兼容的情况下可以不做任何修改。不仅如此&…

【异常】FreeMarker 模板文件找不到问题解决方案 Template not found for name “mail/captcha.ftl“.

一、报错内容 cn.hutool.core.io.IORuntimeException: TemplateNotFoundException: Template not found for name "mail/captcha.ftl". The name was interpreted by this TemplateLoader: ClassTemplateLoader(classLoader="jdk.internal.loader.ClassLoaders…

保姆级教程:Ubuntu搭建本地AI助手,从Docker到DeepSeek-R1一站式指南,建议收藏!

本文主要介绍如何在Ubuntu操作系统环境下&#xff0c;零基础快速安装Docker环境、安装Ollama、安装本地大模型DeepSeek-R1和大模型可视化工具Open WebUI&#xff0c;快速在本地搭建一款专属AI智能小助手。 1.检查Docker环境 检查是否已安装docker运行环境&#xff0c;在控制台…

NAS —— Centos8挂载Nas到本地目录使用(多图完整教程)

需求与结果 需求:有一台Centos8台式机、一台Synology Nas(DS821),需要将Nas挂载到Centos8上目录上进行使用。 最终结果: 步骤 1、首先保证Centos8可以ping通NAS设备、同时可在Centos8上访问NAS网页端。        2、进入NAS网页操作 (1) 进入DSM控制面板 → 共享文件…

由特殊到一般

lc3301 从最大元素开始贪心 对数组降序排序后&#xff0c;让每个元素不超过前一个元素减1 若出现非正数则返回-1&#xff0c;否则计算数组元素总和 class Solution { public: long long maximumTotalSum(vector<int>& maximumHeight) { ranges::sort(max…

【AI+教育】实践:从策略优化到群体应用的探索

例如&#xff0c;有研究聚焦智能苏格拉底绘画机器人的开发。该机器人内置苏格拉底对话模式&#xff0c;这是一种古老的对话模式。苏格拉底的对话模式&#xff0c;主张通过不断追问&#xff0c;引导人们对自身所做之事进行更深层次的反思与思考。研究通过苏格拉底追问式构建多智…

深入解析:基于势场法的多智能体机器人编队控制

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …