跟我学C++高级篇——CRTP的高级应用

一、CRTP的说明

CRTP是一种静态多态的实现方法。说的直白一些就是在正常的认知中,子类继承的是父类,但是如果父类是一个模板类,此模板类中的模板参数是子类的这种特殊情况。CRTP在前面说过两次,如果有对此技术不清楚的可以查看一下“跟我学c++中级篇——CRTP”以及“显式this的应用”中都进行过分析说明。
CRTP本身就是一种很小众的技术应用,而它的一些应用,可能应用范围更小,下面就一些细节进行分析,扩展一下CRTP的更多的应用场景,给大家提供一些应用上的思路。

二、高级应用

CRTP的应用,相对来说就是一种比较复杂的应用。在前面将其基础的一些应用进行了分析说明,本次就CRTP在模板编程中的一些更高级的用法分析一下:
1、模板参数的高级处理
在前面的CRTP文章中基本都是正常的一个参数,其实CRTP模板参数是可以有1~N个或者有默认参数的,看一下代码:

#include <iostream>
#include <string>template <typename T1, typename T2>
class Base {
public:void run(const std::string& d) {if(T2::work()) {static_cast<T1*>(this)->run(d);}}
};struct Condition {static bool work() {std::cout << "condition work" << std::endl;return true;}
};int main() {Derived d;Base<Derived,Condition> *b = &d;b->run("test");//注意和第二种方式调用的不同 return 0;
}

默认参数的处理同样适用于这种情况,大家根据实际情况处理即可,反而更简单。
使用这种多参数的控制,特别是灵活的使用调用方式(参看上下两段代码的注释内容),可以动态的利用具体的场景实现特定的需求。

2、编译及运行优化的支持
最常见的运行优化是使用内联。看下面的例子:

#include <iostream>template <typename T>
class Base {
public:inline int sub(int a, int b) {return static_cast<T*>(this)->subExe(a, b);}
};class Derived : public Base<Derived> {
public:inline int subExe(int a, int b) {return a - b;}
};int main() {Derived d;std::cout << "sub value: " << d.sub(12, 7) << std::endl;//注意和第一种方式调用的不同 return 0;
}

使用内联其实有很多的限定场景,大家一定要能准确的把握内联的限制条件及相关的优缺点,才能更好的使用这种方式。
在模板中是不支持模板的分离编译的,但是CRTP有一个特别的情况,如果假定某个情况下只支持一种子类,那么就可以显示的实例化这个模板,从而减少模板实例化的数量,达到编译期优化的目的。这也算了CRTP的一个特别的应用。不过觉得这种应用稍显有些鸡肋。所以就不举例了,大家可以根据情况自己简单写一个例程测试一下即可。

三、总结

CRTP做为一种模板编程技术,在某些特定的场景下,能够实现一些特殊的技巧,从而提高程序的效率。其实不单单上面的几种情况,CRTP做为一种技术可以与其它的相关的应用广泛结合在一起,目的只有一个,能够让程序的灵活性和适用性更强。
不过,有一个应用的前提,就是尽量减少代码的复杂度。换句话说,不能追求单项目标的极致,而要综合平衡所有的既有条件,整体上达到一个最优。这就需要设计者和开发者能够从宏观把握全局路径,不断进行调整和优化。而上述所讲的这些应用,就是此过程中可以用到的手段和技巧。

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

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

相关文章

Kubernetes架构原则和对象设计(三)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes常见问题解答 本文主要对kubernetes的核心技术概念和核心A…

每日学习 设计模式 五种不同的单例模式

狮子大佬原文 https://blog.csdn.net/weixin_40461281/article/details/135050977 第一种 饿汉式 为什么叫饿汉,指的是"饿" 也就是说对象实例在程序启动时就已经被创建好,不管你是否需要,它都会在类加载时立即实例化,也就是说 实例化是在类加载时候完成的,早早的吃…

Transformer 详解:了解 GPT、BERT 和 T5 背后的模型

目录 什么是 Transformer? Transformer如何工作? Transformer 为何有用? 常见问题解答:机器学习中的 Transformer 在技​​术领域,突破通常来自于修复损坏的东西。制造第一架飞机的人研究过鸟类。莱特兄弟观察了秃鹫如何在气流中保持平衡,意识到稳定性比动力更重要。…

21.2.6 字体和边框

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 通过设置Rang.Font对象的几个成员就可以修改字体&#xff0c;设置Range.Borders就可以修改边框样式。 【例 21.6】【项目&#xff…

1456. 定长子串中元音的最大数目

目录 一、题目二、思路2.1 解题思路2.2 代码尝试2.3 疑难问题 三、解法四、收获4.1 心得4.2 举一反三 一、题目 二、思路 2.1 解题思路 维护一个统计变量&#xff0c;出入时间窗口就判断 2.2 代码尝试 class Solution { public:int maxVowels(string s, int k) {int sum0;i…

[LeetCode]day16 242.有效的字母异位词

242. 有效的字母异位词 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的 字母异位词 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输入: s "rat"…

蓝桥杯---力扣题库第38题目解析

文章目录 1.题目重述2.外观数列举例说明3.思路分析&#xff08;双指针模拟&#xff09;4.代码说明 1.题目重述 外观数列实际上就是给你一串数字&#xff0c;我们需要对于这个数据进行一个简单的描述罢了&#xff1b; 2.外观数列举例说明 外观数列都是从1开始的&#xff0c;也…

Linux网卡配置方法

1、查看IP ip a 网卡状态 UP/down 2、查看网关 如果显示route命令未找到需要下载net-tools软件包 route -n 3、查看DNS服务器地址 DNS服务器地址会存放在/etc/resolv.conf文件中 使用cat命令可以查看 cat /etc/resolv.conf 4、修改网卡配置 方法1&#xff09;编…

DeepSeek使用技巧大全(含本地部署教程)

在人工智能技术日新月异的今天&#xff0c;DeepSeek 作为一款极具创新性和实用性的 AI&#xff0c;在众多同类产品中崭露头角&#xff0c;凭借其卓越的性能和丰富的功能&#xff0c;吸引了大量用户的关注。 DeepSeek 是一款由国内顶尖团队研发的人工智能&#xff0c;它基于先进…

消费电子产品中的噪声对TPS54202的影响

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、概述 在白色家电领域&#xff0c;降压转换器的应用非常广泛&#xff0c;为了实现不同的功能就需要不同的电源轨。TPS542…

无限使用Cursor

原理&#xff1a;运行程序获得15天的免费试用期&#xff0c;重新运行程序重置试用期&#xff0c;实现无限使用。免费的pro账号&#xff0c;一个月有250的高级模型提问次数。 前提&#xff1a;已安装cursor cursor-vip工具&#xff1a;https://cursor.jeter.eu.org?p95d60efe…

Linux之文件IO前世今生

在 Linux之文件系统前世今生&#xff08;一&#xff09; VFS中&#xff0c;我们提到了文件的读写&#xff0c;并给出了简要的读写示意图&#xff0c;本文将分析文件I/O的细节。 一、Buffered I/O&#xff08;缓存I/O&#xff09;& Directed I/O&#xff08;直接I/O&#…

【计组】实验五 J型指令设计实验

目录 一、实验目的 二、实验环境 三、实验原理 四、实验任务 代码 一、实验目的 1. 理解MIPS处理器指令格式及功能。 2. 掌握lw, sw, beq, bne, lui, j, jal指令格式与功能。 3. 掌握ModelSim和ISE\Vivado工具软件。 4. 掌握基本的测试代码编写和FPGA开发板使用方法。 …

扩展知识--缓存和分时复用cpu

在多核CPU中&#xff0c;缓存和分时复用CPU是两个重要的概念&#xff0c;它们分别涉及硬件架构和资源管理策略。以下将从缓存的层次结构、工作原理以及分时复用CPU的概念进行详细解释。 一、多核CPU中的缓存 缓存的定义与作用 缓存&#xff08;Cache&#xff09;是位于CPU与主…

人工智能:从概念到未来

人工智能&#xff1a;从概念到未来 一、引言 在当今数字化时代&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;已从科幻小说和电影中的幻想逐渐走进现实&#xff0c;成为推动社会进步和经济发展的关键力量。它正在深刻地改变着我们的生活…

nvm:node 版本管理器

一、先安装git Git 安装完成后执行 git --version查看版本号是否安装成功 二、安装nvm &#xff08;参考链接&#xff1a;mac 安装nvm详细教程 - 简书&#xff09; 官网&#xff08;https://github.com/nvm-sh/nvm/blob/master/README.md&#xff09;查看最新版本安装命令 …

【1】深入解析 SD-WAN:从思科 SD-WAN 视角看现代网络发展

1. 什么是 SD-WAN? SD-WAN(软件定义广域网,Software-Defined Wide Area Network)是一种基于 SDN(软件定义网络)的广域网技术。它利用软件控制来管理广域网连接、流量和安全策略,从而优化数据传输,提高网络可用性。 传统的广域网(WAN)通常依赖专线(如 MPLS)连接分…

C语言基础学习之环境准备

写在前面 本文看下如何在win环境中使用vs code开发C程序。 1&#xff1a;安装gcc 从这里下载&#xff0c;解压&#xff0c;配置环境变量&#xff0c;执行gcc -v验证: C:\Windows\system32>gcc -v Using built-in specs. COLLECT_GCCgcc COLLECT_LTO_WRAPPERD:/programs/…

LabVIEW之TDMS文件

在很多场合&#xff0c;早期的LabVIEW版本不得不借助常规的数据库来做一些数据管理工作&#xff0c;但常规数据库对于中高速数据采集显然是不合适的&#xff0c;因为高速数据采集的数据量非常大&#xff0c;用一般的数据库无法满足存储数据的要求。 直到TDM(Technical Data Ma…

设置IDEA的内存大小,让IDEA更流畅: 建议设置在 2048 MB 及以上

文章目录 引言I 更改内存设置基于窗口界面进行内存设置修改内存配置文件II IDEA中的一些常见问题及其解决方案引言 方式一:基于窗口界面进行内存设置方式二:修改内存配置文件I 更改内存设置 基于窗口界面进行内存设置 打开IDEA,上方菜单栏 Help > Change Memory Settin…