【学习enable_if模板, 学习unqiue_str 删除操作】

enable_if 是 C++ 标准库中的一个模板结构体,它用于条件编译和 SFINAE(Substitution Failure Is Not An Error)。enable_if 的主要作用是通过条件编译来控制模板的实例化,从而实现条件编译和 SFINAE。

1. enable_if 的基本用法如下:

在这里插入图片描述

#include <iostream>
#include <type_traits>

template<typename T>
struct MyStruct {
    // 当 T 是指针类型时,MyStruct 被实例化
    MyStruct(T* p) : ptr(p) {}

    void print() const {
        if (ptr != nullptr) {
            std::cout << "Pointer value: " << *ptr << std::endl;
        } else {
            std::cout << "Pointer is null" << std::endl;
        }
    }

    T* ptr;
};

int main() {
    // 使用指针类型
    int* p = nullptr;
    MyStruct<int*> ms1(p);

    // 使用非指针类型
    int i = 0;
    // MyStruct<int> ms2(i); // 错误:不能将 int 转换为 MyStruct<int>

    // 调用 print 函数
    ms1.print();

    return 0;
}

在这里插入图片描述

2. enable_if 的另一个常见用法是在函数模板中使用它,以实现 SFINAE。例如:

template<typename T>
typename std::enable_if<std::is_arithmetic<T>::value, void>::type
print() {
    std::cout << "Arithmetic type" << std::endl;
}

template<typename T>
typename std::enable_if<!std::is_arithmetic<T>::value, void>::type
print() {
    std::cout << "Non-arithmetic type" << std::endl;
}

在这个例子中,std::enable_if 被用来控制 print 函数模板的实例化。当 T 是算术类型(如 int、float 等)时,std::is_arithmetic::value 为 true,std::enable_if 将生成一个类型 void,因此 print 被实例化,并输出 “Arithmetic type”。当 T 不是算术类型时,std::is_arithmetic::value 为 false,std::enable_if 将生成一个类型 void,因此 print 不被实例化,print 的另一个实例化版本将被选择。

总之,enable_if 是一个非常有用的工具,它可以用于条件编译和 SFINAE,从而使得模板编程更加灵活和安全。
在这里插入图片描述

实现利用偏特化模板

template<bool B, class T = void>
struct enable_if {};
 
template<class T>
struct enable_if<true, T> { typedef T type; };

可以进一步阅读。
https://blog.csdn.net/wangx_x/article/details/122867422

3. unique_ptr 中删除指针,使用了SFINAE

template <typename _Up>
typename enable_if<is_convertible<_Up (*)[], _Tp (*)[]>::value>::type //注意这里的类型是数组的指针
                                //虽然允许派生类指针隐式的转换为基类指针,为了检查这种转换,我们要写成这样
                                //例如可以从non-const 转换为const,但不能从derived ** 转换为 base **
operator()(_Up *__ptr) const {
  static_assert(sizeof(_Tp) > 0, "can't delete pointer to incomplete type");
  //调用delete[]
  delete[] __ptr;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

放大器稳定性分析

1 稳定性的时域体现 下图的放大器构成的跟随电路且反向输入端有一个电容&#xff0c;电路工作过程如下&#xff1a;输入Vin从0开始增大&#xff0c;Vout也开始上升&#xff0c;Vout通过R给C充电&#xff0c;Vfb点电压随着电容的充电增加&#xff0c;Vfb就相对与Vout存在时延&a…

学习记录:基于Z-Stack 3.0.1的Zigbee智能插座实现

引言 本文记录了笔者基于Z-Stack 3.0.1协议栈&#xff0c;通过学习Zigbee通信协议&#xff0c;实现一个简单的智能插座控制过程。通过这个过程&#xff0c;笔者对Zigbee网络的形成、设备间的通信以及低功耗设计有了更深入的理解。 工程代码链接&#xff1a;链接&#xff1a;h…

Python Matplotlib 如何处理大数据集的绘制,提高绘图效率

Python Matplotlib 如何处理大数据集的绘制&#xff0c;提高绘图效率 在数据分析和可视化的过程中&#xff0c;处理大数据集常常是我们面临的挑战。绘制大数据集不仅需要时间和计算资源&#xff0c;还可能导致图形显示不流畅&#xff0c;甚至崩溃。Matplotlib 是 Python 中一个…

2016-2020年全国保护性耕作/常规耕作农田分类数据集

2016-2020年全国保护性耕作/常规耕作农田分类数据集 数据介绍 基于Sentinel-2遥感产品&#xff0c;使用来自文献调研和目视解译产生的保护性/常规耕作样本点&#xff0c;通过交叉验证方法训练随机森林分类器&#xff0c;生成了2016-2020年全国保护性耕作/常规耕作农田分类数据…

VMware系统镜像推荐网站

今天准备找一个Mac系统的镜像&#xff0c;在网上搜大部分都是广告&#xff0c;有的还做的很隐蔽&#xff0c;不点进去都无法确定&#xff0c;非常麻烦&#xff0c;不如多花点时间自己整理一个使用的网站。 如果有更优推荐&#xff0c;请在评论中说明&#xff0c;我会及时更新并…

国标GB28181-2022平台EasyGBS国标GB28181软件:GB/T28181-2022解读、应用和技术实现

随着信息技术的飞速发展&#xff0c;视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在这一变革中&#xff0c;国标GB28181-2022平台EasyGBS作为一款基于GB28181标准的视频监控集成与管理平台&#xff0c;凭借其卓越的性能、高度的灵活性和用户友好的设计&#…

【ONLYOFFICE 文档 8.2 版本深度测评】功能革新与用户体验的双重飞跃

引言 在数字化办公的浪潮中&#xff0c;ONLYOFFICE 文档以其强大的在线协作功能和全面的办公套件解决方案&#xff0c;赢得了全球用户的青睐。随着 8.2 版本的发布&#xff0c;ONLYOFFICE 再次证明了其在办公软件领域的创新能力和技术实力。 一.协作编辑 PDF&#xff1a;团队合…

什么是人工智能学习框架?——人工智能技术科普指南

随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;AI应用已经广泛覆盖到我们的日常生活中&#xff1a;从智能推荐系统到语音助手&#xff0c;再到自动驾驶技术。然而&#xff0c;很多人并不清楚人工智能模型是如何构建的。要理解这一点&#xff0c;首先得了解人工…

基于Spring Boot的高校物品捐赠管理系统设计与实现,LW+源码+讲解

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装高校物品捐赠管理系统软件来发挥其高效地信息处理的作用&a…

部署istio应用未能产生Envoy sidecar代理

1. 问题描述及原因分析 在部署Prometheus、Grafana、Zipkin、Kiali监控度量Istio的第2.2章节&#xff0c;部署nginx应用&#xff0c;创建的pod并没有产生Envoy sidecar代理&#xff0c;仅有一个应用容器运行中 故在随后的prometheus中也没有产生指标istio_requests_total。通…

跨越科技与文化的桥梁——ROSCon China 2024 即将盛大开幕

在全球机器人技术飞速发展的浪潮中&#xff0c;ROS&#xff08;Robot Operating System&#xff09;作为一款开源的机器人操作系统&#xff0c;已成为无数开发者、研究人员和企业的首选工具。为了进一步推动ROS的应用与发展&#xff0c;全球知名的机器人操作系统会议——ROSCon…

TensorRT-LLM的k8s弹性伸缩部署方案

Scaling LLMs with NVIDIA Triton and NVIDIA TensorRT-LLM Using Kubernetes | NVIDIA Technical Blog 一共涉及4个k8s组件&#xff1a; 1. Deployment&#xff1a;跑起来N个pod&#xff1b;指定NVIDIA官方的triton&trt-llm的docker image&#xff0c;指定好model放在哪个…

AJAX学习笔记总结

目录 AJAX简介 XML简介 AJAX的特点 AJAX的优点 AJAX的缺点 服务端框架 GET请求 绑定事件步骤&#xff1a; 需求案例 body代码 POST请求 跨域 同源策略 如何解决跨域 JSONP JSONP是什么&#xff1f; JSONP怎么工作的 JSONP的使用 CORS CORS是什么&#xff1…

谷粒商城のsentinelzipkin

文章目录 前言一、Sentinel1、什么是Sentinel2、项目配置3、使用案例3.1、流控3.2、降级3.3、黑白名单设置 二、Zipkin1、什么是Zipkin2、项目配置3、整合案例 前言 本篇介绍Spring Cloud Ali的sentinel组件&#xff0c;用于对微服务的熔断降级&#xff0c;以及链路追踪zipkin的…

25国考照片处理器使用流程图解❗

1、打开“国家公务员局”网站&#xff0c;进入2025公务员专题&#xff0c;找到考生考务入口 2、点击下载地址 3、这几个下载链接都可以 4、下载压缩包 5、解压后先看“使用说明”&#xff0c;再找到“照片处理工具”双击。 6、双击后会进入这样的界面&#xff0c;点击&…

UE5.4 PCG Layered Biomes插件

B站学习链接 官方文档 一、PCGSpawn Preset&#xff1a;负责管理PCG要用到的植被资产有哪些 二、BiomesSettings&#xff1a;设置要使用的植被资产Layer、Spawn参数 1.高度Layer参数&#xff1a; 2.地形Layer&#xff1a;我这里用地形样条线绘制了一块地形Layer 绘制点和…

vrrp和mstp,vrrp和byd

vrrp和mstp 思路 vrrp是用来虚拟网关&#xff0c;噢&#xff0c;是虚拟一条虚拟网关 优先级&#xff0c;priority越大越优先&#xff0c;优先级相同&#xff0c;哪个的路由器的vrrp先起来&#xff0c;谁就是主 mstp是快速生成树协议&#xff0c;防止环路用的 优先级越小越优…

pycharm设定代码模板

1、在文件点击设置 ​​​​​​​ ​​​​​​​ 2、点击编辑器--实时模板--找到需要插入模板的位置如我要插入HTML的模板---选择--点击实时模板 3、如图&#xff1a; 4、添加模板内容&#xff0c;如果模板有变量可以在编辑变量处点击编辑 5、编辑变量 6、点…

什么是红客?红客入门基础(非常详细)零基础入门到精通,收藏这篇就够了

什么是红客&#xff1a; 提到红客&#xff0c;我们不得不想到2001年中美黑客大战&#xff0c;红客联盟等这些词汇。曾几何时这个群体给尚且稚嫩的国内安全环境带来了一枚种子&#xff0c;从此网络安全在这片土地开始发芽。不知道有多少人是受到红客的影响走上了安全这条路&…

从新手到专家:7款电脑平面设计软件评测

平面设计在时尚、广告等多个领域扮演着重要角色&#xff0c;而创作出独特且富有创意的设计作品则需要依赖优秀的电脑平面设计软件。市场上的电脑平面设计软件众多&#xff0c;每款软件都有其独到之处。本文将为你推荐几款值得关注的电脑平面设计软件&#xff0c;并分析它们的特…