C++:奇异递归模板模式(CRTP模式)

news2024/9/24 9:20:54

奇异递归模板模式

文章目录

  • 奇异递归模板模式
    • 理论说明
    • CRTP模式的功能
      • 静态多态
      • 强制静态接口
      • 编译时多态优化
        • 解释

理论说明

奇异递归模板模式(Curiously Recurring Template Pattern, CRTP) 是一种设计模式,其原理很简单:

继承者将自身作为模板参数传递给基类

如下:

struct Foo : SomeBase<Foo>
{
...
}

CRTP模式的功能

静态多态

通过 CRTP,可以在编译时实现多态行为,而不是依赖于运行时多态(如虚函数表)。这可以减少运行时开销,因为编译器可以内联函数调用。

#include<iostream>
using namespace std;

template <typename Derived>
class Shape {
public:
        void draw() {
                static_cast<Derived*>(this)->draw();
        }
};

class circle : public Shape<circle> {
public:
        void draw() {
                cout << "Drawing a circle" << endl;
        }
};

class square : public Shape<square> {
public:
        void draw() {
                cout << "Drawing a square" << endl;
        }
};

int main() {
        circle circle;
        square square;
        circle.draw();
        square.draw();
        return 0;
}

运行结果:

Drawing a circle
Drawing a square

强制静态接口

CRTP 可以用于确保派生类实现某些接口,因为基类可以调用派生类的方法。如果派生类未实现这些方法,将在编译时产生错误。

template <typename Derived>
class Interface {
public:
    void perform() {
        static_cast<Derived*>(this)->perform();
    }
};

class Implementation : public Interface<Implementation> {
public:
    void perform() {
        std::cout << "Performing implementation" << std::endl;
    }
};

在上面的代码中,基类保证了子类必须有 perform 函数的重写,也就是强制接口。

编译时多态优化

CRTP 可以帮助实现一些模板元编程技术,优化代码在编译时的行为。例如,EBO(Empty Base Optimization)可以利用 CRTP 来减少对象的内存占用。

template <typename T>
class EmptyBase {
};

class Derived : public EmptyBase<Derived> {
};

在 C++ 中,如果一个类是空的(即没有非静态成员变量,没有虚函数,没有虚基类),它通常不会占用任何内存空间。这个优化称为 空基类优化(Empty Base Optimization, EBO)。当一个派生类继承一个空基类时,编译器可以将这个基类的存储空间与派生类的其他成员共享,从而减少内存占用。

用下面的代码来做解释:

#include <iostream>

template <typename T>
class EmptyBase {
    // Empty base class
};

class NonEmptyDerived : public EmptyBase<NonEmptyDerived> {
public:
    int data;
};

int main() {
    std::cout << "Size of EmptyBase: " << sizeof(EmptyBase<NonEmptyDerived>) << std::endl;
    std::cout << "Size of NonEmptyDerived: " << sizeof(NonEmptyDerived) << std::endl;
    return 0;
}


输出结果:
1

解释
  • EmptyBase<NonEmptyDerived> 是一个空基类,按照一般规则,空类通常会占用 1 字节的空间来保证不同对象具有唯一的地址。

  • NonEmptyDerived 继承自 EmptyBase<NonEmptyDerived>,并且有一个 int 成员 data。通常 int 占用 4 字节空间。

由于 EmptyBase 是空的,编译器会应用 EBO,将 EmptyBase 的存储空间与 NonEmptyDerived 的 data 成员共享。因此,最终的 NonEmptyDerived 对象大小仅为 4 字节,即 int 的大小,而没有额外增加由于基类而带来的存储开销。

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

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

相关文章

工业三防平板赋能自动化产线打造工厂智慧管理

随着工业4.0时代的到来&#xff0c;智能制造成为了众多企业转型升级的必然选择。而MES系统作为智能制造的核心环节&#xff0c;能够有效地整合生产数据&#xff0c;提升生产效率&#xff0c;并实现工厂运营的数字化管理。然而&#xff0c;传统的MES系统大多依赖于PC端操作&…

关于vs调试的一些基本技巧方法,建议新手学习

文章目录 1.Debug 和 Release2.VS的调试快捷键3.对程序的监视和内存观察3.1监视3.2内存 4.编程常见错误归类4.1编译型错误4.2链接型错误4.3运行时错误 1.Debug 和 Release 在我们使用的编译器 vs 中&#xff0c;这个位置有两个选项&#xff0c;分别为Debug和Release&#xff0c…

开源应用:AI监测如何成为社会安全的智能盾牌

社会背景 随着社会的快速发展&#xff0c;社会安全管理正站在一个新时代的门槛上。社会对安全管理的需求不断增长&#xff0c;传统的安全措施已难以满足现代社会的需求。AI技术以其独特的数据处理和模式识别能力&#xff0c;正在成为我们社会安全的智能盾牌。 AI大模型识别功能…

【牛客】2024暑期牛客多校6 补题记录

文章目录 A - Cake&#xff08;树上dp&#xff09;B - Cake 2&#xff08;暴力&#xff09;D - Puzzle: Wagiri&#xff08;tarjan&#xff09;F - Challenge NPC 2&#xff08;构造&#xff09;H - Genshin Impacts Fault&#xff08;签到&#xff09;I - Intersecting Interv…

利用扩散模型DDPM生成高分辨率图像|(一)DDPM模型构建

利用扩散模型DDPM生成高分辨率图像&#xff08;生成高保真图像项目实践&#xff09; Mindspore框架利用扩散模型DDPM生成高分辨率图像|&#xff08;一&#xff09;关于denoising diffusion probabilistic model &#xff08;DDPM&#xff09;模型 Mindspore框架利用扩散模型DD…

数字音频工作站(DAW)FL Studio 24.1.1.4239中文破解版

FL Studio 24.1.1.4239中文破解版是一款功能强大的数字音频工作站&#xff08;DAW&#xff09;&#xff0c;它广泛应用于音乐创作和音乐制作领域。FL Studio是由比利时软件公司Image-Line开发的音乐制作软件&#xff0c;它拥有丰富的音效、合成器、采样器、鼓机等工具。FL Stud…

stm32cubemx+ADC的多通道轮询数据采集和DMA数据采集实现,亲测可用

ADC是单片机的重要组成&#xff0c;也是存在一定的难点。 一、多通道轮询数据采集。 1、配置时钟&#xff0c;用的无源晶振。 2、SW烧写方式 添加USART 3、ADC选择了四个通道 其中两个是采集电压&#xff0c;另外两个是采集芯片内部温度和参考电压。 4、配置采集模式 这里是…

萌啦数据官网丨萌啦ozon数据分析工具官网

在当今这个数据驱动的时代&#xff0c;电子商务的蓬勃发展离不开精准的数据分析与洞察。对于在OZON平台上耕耘的商家而言&#xff0c;掌握市场趋势、优化产品布局、提升运营效率成为了赢得竞争的关键。正是在这样的背景下&#xff0c;萌啦数据官网应运而生&#xff0c;作为一款…

信用卡使用雷区大揭秘:为何你贷款被拒?

​好多朋友明明条件挺好&#xff0c;但申请银行贷款时却吃了闭门羹&#xff0c;一查征信&#xff0c;原来是信用卡使用上栽了跟头。信用卡可是个关键角色&#xff0c;用得好助力贷款&#xff0c;用得不好&#xff0c;直接拖后腿。今天咱们就聊聊信用卡对贷款申请的影响情况和解…

鸿蒙OS ArkTS 省市县级联选择框,封装组件

背景&#xff1a; 公司现在要开发纯血鸿蒙版本APP&#xff0c;我被抽调过来做点功能。现在要做一个省市县级联选择框&#xff0c;并且要封装为组件&#xff0c;供其他页面模块使用。 效果图&#xff1a; 难点&#xff1a; 1. 现在官方文档上只是查到了TextPicker组件是可以做…

建筑设计遇上这几个工具,就是锦上添花!

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/2161.html 当AI遇上建筑&#xff0c;设计界的火花就这样擦出来了&#xff01;&#x1f440; 身为一名内外饰设计工程师&#xff0c;你是否也在担心作品不经意间借鉴过了头…

Tomcat启动控制台乱码解决方案

前言 事情的起因是这样的&#xff0c;当时我用了阿里云osssdk里的代码下载文件&#xff0c;如下 ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(pathName)); &#xff0c;开始一切顺利&#xff0c;直到部署正式环境后&#xff0c;用了一段时间…

【Material-UI】Button 组件中的尺寸设置(Sizes)详解

文章目录 一、基础尺寸选项1. 小尺寸&#xff08;Small&#xff09;2. 中等尺寸&#xff08;Medium&#xff09;3. 大尺寸&#xff08;Large&#xff09; 二、尺寸的应用场景三、高级用法和最佳实践1. 使用主题调整默认尺寸2. 确保一致性3. 考虑无障碍设计 四、总结 在用户界面…

代码随想录算法训练营第五十二天|101.孤岛的总面积 、102.沉没孤岛 、103.水流问题 、104.建造最大岛屿

101. 孤岛的总面积 DFS搜索&#xff1a; dfs 函数是一个递归函数&#xff0c;用于深度优先搜索&#xff08;DFS&#xff09;遍历网格中的陆地区域。它将访问过的陆地标记为0&#xff0c;并统计陆地的数量。 我们首先定义了四个方向的移动偏移量 dir。 global count 语句用于声…

C++入门2

函数重载 函数重载&#xff1a;是函数的一种特殊情况&#xff0c;C允许在同一作用域中声明几个功能类似的同名函数&#xff0c;这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同&#xff0c;常用来处理实现功能类似数据类型 不同的问题 比如下面的 int add(int x…

数据结构和算法|递归算法那些事(递归算法的时间复杂度、尾递归优化、斐波那契数列)

对于文章的第一部分&#xff0c;递归算法的时间复杂度&#xff0c;来自于代码随想录文章:通过一道面试题目&#xff0c;讲一讲递归算法的时间复杂度&#xff01; 对于第二节尾递归优化来自于B站&#xff1a;尾递归优化&#xff1a;你的递归调用是如何被优化的&#xff1f; 文章…

Spring Boot - 通过ApplicationListener实现接口请求的性能监控

文章目录 概述1. ServletRequestHandledEvent事件2. 实现步骤3. 优缺点分析4. 测试与验证小结其他方案1. 自定义拦截器2. 性能监控平台3. 使用Spring Boot Actuator4. APM工具 概述 在Spring框架中&#xff0c;监控接口请求的性能可以通过ServletRequestHandledEvent事件实现。…

【Java日志系列】日志概述

目录 前言 一、日志概述 二、日志文件 1. 调试日志 2. 系统日志 三、日志框架 1. 日志框架的作用 2. 日志框架的价值 3. 市面上流行的日志框架 4. 日志门面和日志实现的区别 总结 前言 在软件开发中&#xff0c;日志记录是一项至关重要的任务。无论是简单的命令行应…

微服务架构-SpringCloud

1.单体应用架构 将项目所有模块(功能)打成jar或者war&#xff0c;然后部署一个进程。 优点&#xff1a; 部署简单&#xff1a;由于是完整的结构体&#xff0c;可以直接部署在一个服务器上即可。技术单一&#xff1a;项目不需要复杂的技术栈&#xff0c;往往一套熟悉的技术栈就…

Netty技术全解析:LineBasedFrameDecoder类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…