c++23中的新功能之十七显示this的应用

一、显示this

在前面的文章中分析了显示this(Deducing This),具体的内容请移步《c++23新功能之二语法中的Deducing This》,本篇对显示this对实际应用中的一些完善和更新形式进行分析说明,抛砖引玉。

二、CRTP的应用

在前面的学习中,学过CRTP(Curiously Recurring Template Pattern ,奇异递归模板模式),其实就是在传统的子继承父的基础上,在利用模板时,将子类传入到父类模板中去的一种转置继承。在前面的文中也对其中的一些用法和特点进行了分析说明。重点是知道了一般这种情况都是在模板的元编程中使用。下面看一下在c++23前后的应用方式的不同情况:

1、传统方式

#include <iostream>
template <class T>
class Base
{
public:void Display(){static_cast<T*>(this)->Data();}static void Call(){T::Call();}
};class Derived : public Base<Derived>
{
public:void Data() { std::cout << "Derived function :Data()" << std::endl; };static void Call() { std::cout << "Derived function :Call()" << std::endl; };
};
int main()
{Derived d;Base<Derived> *b = &d;b->Display();b->Call();
}

这个例子非常简单,在前文也出现过。

2、c++23的应用方式

class Base
{
public:template<typename T>void Display(this T&&t){t.Data();}
};class Derived : public Base
{
public:void Data() { std::cout << "Derived function :Data()" << std::endl; };
};
int main()
{Derived d;Base b;b.Display(d);//b.<Derived>(std::move(d));//ok other
}

三、在设计模式中的应用

1、传统方式
举一个构建者的例子:


template <typename T = void>
class BuilderOld
{using Derived = std::conditional_t<std::is_void_v<T>, BuilderOld, T>;
public:Derived& owner(){std::cout << "Builder owner" << std::endl;return *static_cast<Derived*>(this);}public:Derived& setColor(int color) { std::cout << "color is: "<<color << std::endl; return owner(); }Derived& setAge(int age) { std::cout << "age is:"<<age << std::endl; return owner(); }Derived& setSex(int sex) { std::cout << "sex is:"<<sex << std::endl; return owner(); }
};class DOld :public BuilderOld<DOld>
{
public:DOld& setLen(int l) { std::cout << "set len is:" <<l<< std::endl; return *this; }DOld& setWidth(int w) { std::cout << "set width is:"<<w << std::endl; return *this; }
};int main()
{BuilderOld<>().setColor(1).setAge(2).setColor(3).setSex(6);//vcBuilderOld().setColor(1).setAge(2).setColor(3).setSex(6);//g++DOld().setColor(2).setLen(9).setWidth(9).setSex(9);return 0;
}

2、c++23中的应用方式
在C++23中,使用显示this来对其进行处理:

class Builder23
{
public:template <typename T>owner& setColor(this T&& t,int color) { std::cout << "set color is:" << color << std::endl; return owner; }template <typename T>owner& setAge(this T&& t,int age) { std::cout << "set age is:" << age << std::endl; return owner; }template <typename T>owner& setSex(this T&& t,int sex) { std::cout << "set sex is:" << sex << std::endl; return owner; }
};class D23 :public Builder23
{
public:D23& setLen(int l) { std::cout << "c++23:set len is:" << l << std::endl; return *this; }D23& setWidth( int w) { std::cout << "c++23:set width is:" << w << std::endl; return *this; }
};int main()
{Builder23().setColor(1).setAge(9).setColor(11).setSex();D23().setColor().setLen().setWidth().setSex();return 0;
}

在Builder中,不一定非要这种流式调用的方法,其它方法也有很多。重点在于如何真正理解Builder的本身存在的目的。在c++中,实现流式的方法有不少方式,但采用CRTP的方式是一种在编译期处理的情况,这就看具体的需要来决定采用哪种情况了。

三、总结

学以致用,用才是关键。学而不用,和不学没有什么区别。具体到计算机的技术上,学而不用,简单来说时间长会忘记,另外一个问题是,计算机技术的迅速更迭,导致形成自身的技术断层,甚至某些技术直接就被淘汰了。这样,再想形成一个完整的知识体系,就非常困难了。同样,也不利于快速的跟进新技术的发展。

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

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

相关文章

ARM映像文件组成

引言 ARM编译器将各种源文件&#xff08;汇编文件、C语言程序文件、C语言程序文件&#xff09;编译生成ELF格式的目标文件&#xff08;后缀为.o文件&#xff0c;以下将目标文件简称为.o文件&#xff09;&#xff0c;.o文件经过连接器&#xff0c;和C/C运行时库一起编译生成ELF格…

如何解决香港服务器使用的常见问题

​  站长们在选择香港服务器租用时会考虑到它的各种性能以及稳定性&#xff0c;这是必须的。但是使用过程中还有些问题也不容忽视&#xff0c;比如&#xff1a;带宽资源是否短缺&#xff0c;是否存在安全漏洞&#xff0c;连接是否正常等这些问题也要考虑到。 香港服务器使用中…

php判断是否是email格式

要判断一个字符串是否是有效的电子邮件地址&#xff0c;你可以使用正则表达式和PHP内置函数来完成。以下是一个示例代码&#xff1a; $email "exampleexample.com"; // 你要检查的电子邮件地址// 使用正则表达式检查电子邮件格式 if (filter_var($email, FILTER_VA…

数据库备份与恢复(实战mysqldump+bin-log)

一、为什么要进行数据库备份&#xff1f; 常见数据库备份的应用场景如下&#xff1a; 数据丢失应用场景&#xff1a; 人为操作失误造成某些数据被误操作 软件 BUG 造成部分数据或全部数据丢失 硬件故障造成数据库部分数据或全部数据丢失 安全漏洞被入侵数据恶意破坏 非数据丢…

UV统计 - HyperLogLog

UV统计 - HyperLogLog 首先我们搞懂两个概念&#xff1a; UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站&#xff0c;只记录1次。PV&#xff1a;全称Page View&#xff…

Leetcode—2331.计算布尔二叉树的值【简单】

2023每日刷题&#xff08;六&#xff09; Leetcode—2331.计算布尔二叉树的值 递归实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool evaluateTree(struct TreeNod…

【算法与数据结构】--算法应用--算法在实际问题中的应用

一、算法在搜索引擎中的应用 搜索引擎是计算机科学中算法应用的典型领域之一。搜索引擎的主要任务是帮助用户在海量数据中快速找到相关信息。以下是算法在搜索引擎中的主要应用&#xff1a; 爬虫算法&#xff1a;爬虫是搜索引擎的基础&#xff0c;用于自动抓取互联网上的网页…

2.1.C++项目:网络版五子棋对战之前置知识

文章目录 一、Websocketpp&#xff08;一&#xff09;Websocket介绍&#xff08;二&#xff09;报文格式&#xff08;三&#xff09;Websocketpp介绍&#xff08;四&#xff09;Websocketpp使用1.websocketpp常用接口介绍2. http/websocket服务器 &#xff08;五&#xff09;Js…

SLAM ORB-SLAM2(5)例程了解

SLAM ORB-SLAM2(5)例程了解 1. TUM 数据集1.1. 三种相机1.2. 目录结构2. 单目demo2.1. 参数校验2.2. 配置数据集图像路径2.3. 创建单目SLAM2.3. 处理图像数据2.4. 结束3. RGB-D demo3.1. 参数校验3.2. 配置数据集图像路径3.3. 创建 RGB-D SLAM3.3. 处理图像数据3.4. 结束4. 总…

动画制作软件 Animate 2024 mac中文版介绍说明(an2024) v24.0

Animate 2024 mac是一款动画制作软件&#xff0c;它能帮助用户轻松制作出各种精美的动画作品。 Animate 2024拥有强大而直观的设计工作流程&#xff0c;能够让用户自由地构建动画场景、绘制精美的图形&#xff0c;并轻松添加动态效果。无论是传统手绘风格还是骨骼动画&#xff…

rust的排序

Vec 中的 Methods from Deref<Target [T]> 示例 fn main() {let mut strings vec!["banana", "", "ban", "", "apple", "alpha", "cherry", "date"];strings.sort_by(|a, b| {if a…

CUDA学习笔记(七)Kernel性能调节

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/&#xff0c;仅用于学习。 Exposing Parallelism 这部分主要介绍并行分析&#xff0c;涉及掌握nvprof的几个metric参数&#xff0c;具体的这些调节为什么会影响性能会在后续博文解释。 代码准备 下面是我们的kernel…

类和对象介绍

一、类 1.类的声明 class Box{//类名private://私有成员double width,length,height;//长&#xff0c;宽&#xff0c;高 public://公有成员void init(double l,double w,double h){//初始化 lengthl;widthw;heighth;}double S(){//求表面积 return (height*lengthheight*width…

【Lua语法】字符串

Lua语言中的字符串是不可变值。不能像在C语言中那样直接改变某个字符串中的某个字符&#xff0c;但是可以通过创建一个新字符串的方式来达到修改的目的 print(add2(1 , 2 ,15,3))a "no one"b string.gsub(a , "no" , "on1111")print(a) print…

【Python】AttributeError: module lib has no attribute X509_V_FLAG_CB_ISSUER_CHECK

问题&#xff1a; 运行脚本报错&#xff1a;module lib has no attribute X509_V_FLAG_CB_ISSUER_CHECK 原因&#xff1a; pyOpenSSL版本与python版本不匹配 解决方案&#xff1a; window系统 重新安装pyOpenSSL 1、卸载当前版本pyOpenSSL pip uninstall pyOpenSSL2、重新…

flink问题 集合

1.flink 乱码 在配置文件flink-conf.yaml增加配置项&#xff1a;env.java.opts: -Dfile.encodingUTF-8

神经网络的不同类型的层

神经网络可以包含多个不同类型的层&#xff0c;每种层都具有不同的特点和应用场景。以下是常见的神经网络层的分类及其详细特点和应用场景&#xff1a; 1. 输入层&#xff08;Input Layer&#xff09;&#xff1a; 特点&#xff1a;输入层通常不包含任何权重或激活函数&#…

第87步 时间序列建模实战:LSTM回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍大名鼎鼎的LSTM回归。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal…

Compose Desktop 使用中的几个问题(分平台加载资源、编写Gradle 任务下载平台资源、桌面特有组件、鼠标键盘事件)

前言 在我之前的文章 Compose For Desktop 实践&#xff1a;使用 Compose-jb 做一个时间水印助手 中&#xff0c;我们使用 Compose For Desktop 写了一个用于读取照片 EXIF 中的拍摄日期参数并以文字水印的方式添加到照片上的桌面程序。 但是事实上&#xff0c;这个程序的名字…

从入门到进阶 之 ElasticSearch SpringData 继承篇

&#x1f339; 以上分享 从入门到进阶 之 ElasticSearch SpringData 继承篇&#xff0c;如有问题请指教写。&#x1f339;&#x1f339; 如你对技术也感兴趣&#xff0c;欢迎交流。&#x1f339;&#x1f339;&#x1f339; 如有需要&#xff0c;请&#x1f44d;点赞&#x1f…